diff options
author | Lev Walkin <vlm@lionet.info> | 2012-01-22 16:38:37 -0800 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2012-01-22 16:38:37 -0800 |
commit | 9a338f8d256702a264df8ab0230e0d0f4019b9f4 (patch) | |
tree | 4374c138627a24587f6cc27d4bd642d9e885e3c0 | |
parent | e8727ec286439b8a00d0b312f156244f8fd88764 (diff) |
unbreak overflow detection in gcc 4.4.3 (4.x?)
-rw-r--r-- | skeletons/GeneralizedTime.c | 6 | ||||
-rw-r--r-- | skeletons/INTEGER.c | 4 | ||||
-rw-r--r-- | skeletons/OBJECT_IDENTIFIER.c | 3 |
3 files changed, 9 insertions, 4 deletions
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 1a16ba8a..7794bd43 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -314,7 +314,8 @@ asn_GT2time_prec(const GeneralizedTime_t *st, int *frac_value, int frac_digits, while(fd > frac_digits) fv /= 10, fd--; while(fd < frac_digits) { - int new_fv = fv * 10; + int volatile new_fv = fv * 10; + /* GCC 4.x is being too smart without volatile */ if(new_fv / 10 != fv) { /* Too long precision request */ fv = 0; @@ -441,7 +442,8 @@ asn_GT2time_frac(const GeneralizedTime_t *st, int *frac_value, int *frac_digits, */ for(buf++; buf < end; buf++) { int v = *buf; - int new_fvalue; + int volatile new_fvalue; + /* GCC 4.x is being too smart without volatile */ switch(v) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 5b103159..e7a5ba67 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -396,7 +396,9 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun } { - long new_value = value * 10; + long volatile new_value = value * 10; + /* GCC 4.x optimizes (new_value) without `volatile' + * so the following check does not detect overflow. */ if(new_value / 10 != value) /* Overflow */ diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 0d7043e6..ed083f8a 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -691,7 +691,8 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, value = 0; } if(1) { - long new_value = value * 10; + long volatile new_value = value * 10; + /* GCC 4.x is being too smart without volatile */ if(new_value / 10 != value || (value = new_value + (*oid_text - 0x30)) < 0) { /* Overflow */ |