diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2022-11-21 14:18:44 +1100 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2022-11-21 14:18:44 +1100 |
commit | 2cd89f862cdb04d91c5d59c5b39647f7d5d5b3b8 (patch) | |
tree | 31fc5b4e943cb36db308bd2c3b2eed6e348a1de3 /dtc-parser.y | |
parent | 55778a03df61623ddd743b04772ab90ce128db61 (diff) | |
download | dtc-2cd89f862cdb04d91c5d59c5b39647f7d5d5b3b8.zip dtc-2cd89f862cdb04d91c5d59c5b39647f7d5d5b3b8.tar.gz dtc-2cd89f862cdb04d91c5d59c5b39647f7d5d5b3b8.tar.bz2 |
dtc: Warning rather than error on possible truncation of cell values
We always evaluate integer values in cell arrays as 64-bit quantities, then
truncate to the size of the array cells (32-bit by default). However to
detect accidental truncation of meaningful values, we give an error if the
truncated portion isn't either all 0 or all 1 bits. However, this can
still give counterintuitive errors. For if the user is thinking in 2's
complement 32-bit arithmetic (which would be quite natural), then they'd
expect the expression (-0xffffffff-2) to evaluate to -1 (0xffffffff).
However in 64-bit it evaluates to 0xfffffffeffffffff which does truncate
to the expected value but trips this error message.
Because of this reduce the error to only a warnings, with a somewhat more
helpful message.
Fixes: https://github.com/dgibson/dtc/issues/74
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'dtc-parser.y')
-rw-r--r-- | dtc-parser.y | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/dtc-parser.y b/dtc-parser.y index 46457d4..bff1337 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -404,9 +404,14 @@ arrayprefix: * within the mask to one (i.e. | in the * mask), all bits are one. */ - if (($2 > mask) && (($2 | mask) != -1ULL)) - ERROR(&@2, "Value out of range for" - " %d-bit array element", $1.bits); + if (($2 > mask) && (($2 | mask) != -1ULL)) { + char *loc = srcpos_string(&@2); + fprintf(stderr, + "WARNING: %s: Value 0x%016" PRIx64 + " truncated to 0x%0*" PRIx64 "\n", + loc, $2, $1.bits / 4, ($2 & mask)); + free(loc); + } } $$.data = data_append_integer($1.data, $2, $1.bits); |