From 75ba9abcd293ca25599322ad9a0bc1500efa87b3 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Fri, 22 Mar 2024 16:04:53 -0400 Subject: [PATCH 1/3] A8-4-7: fix type size rounding error --- change_notes/2024-03-22-fix-fp-89-a8-4-7.md | 2 ++ .../src/rules/A8-4-7/TriviallyCopyableSmallType.qll | 2 +- cpp/autosar/test/rules/A8-4-7/test.cpp | 12 +++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 change_notes/2024-03-22-fix-fp-89-a8-4-7.md diff --git a/change_notes/2024-03-22-fix-fp-89-a8-4-7.md b/change_notes/2024-03-22-fix-fp-89-a8-4-7.md new file mode 100644 index 0000000000..755bdbd2b5 --- /dev/null +++ b/change_notes/2024-03-22-fix-fp-89-a8-4-7.md @@ -0,0 +1,2 @@ +- `A8-4-7` - `InParametersForCheapToCopyTypesNotPassedByValue.ql`, `InParametersForCheapToCopyTypesNotPassedByReference.ql`: + - Fixes #89. Accidental floor rounding was applying to type size calculations. \ No newline at end of file diff --git a/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll b/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll index 4746bb9d79..588aef8017 100644 --- a/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll +++ b/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll @@ -12,7 +12,7 @@ int wordSize() { result = max(VoidPointerType v | | v.getSize()) } * Converts bytes to words */ bindingset[bytes] -int bytesToWords(int bytes) { result = bytes / wordSize() } +float bytesToWords(float bytes) { result = bytes / wordSize() } class TriviallyCopyableSmallType extends Type { TriviallyCopyableSmallType() { diff --git a/cpp/autosar/test/rules/A8-4-7/test.cpp b/cpp/autosar/test/rules/A8-4-7/test.cpp index aa0c3b3e02..48b574805e 100644 --- a/cpp/autosar/test/rules/A8-4-7/test.cpp +++ b/cpp/autosar/test/rules/A8-4-7/test.cpp @@ -68,4 +68,14 @@ struct S5 { void f15(S3 f15a) {} // COMPLIANT void f17(S4 f17a) {} // NON_COMPLIANT (S4 has a non-trivial destructor) -void f18(S5 f18a) {} // COMPLIANT \ No newline at end of file +void f18(S5 f18a) {} // COMPLIANT + +#include +class A8_4_7 { +public: + std::array values; +}; +void fp_reported_in_82( + const A8_4_7 &a847) noexcept { // COMPLIANT - larger than 2 words + std::cout << a847.values[0] << std::endl; +} \ No newline at end of file From bd07f27142ab316fa9363d197eec2c24b3bffa65 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Mon, 25 Mar 2024 14:58:29 -0400 Subject: [PATCH 2/3] Update cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll Co-authored-by: Remco Vermeulen --- cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll b/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll index 588aef8017..f06da410c4 100644 --- a/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll +++ b/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll @@ -12,7 +12,7 @@ int wordSize() { result = max(VoidPointerType v | | v.getSize()) } * Converts bytes to words */ bindingset[bytes] -float bytesToWords(float bytes) { result = bytes / wordSize() } +int minWordsRequiredToRepresentBytes(int bytes) { result = (1.0*bytes / wordSize()).ceil() } class TriviallyCopyableSmallType extends Type { TriviallyCopyableSmallType() { From b174b09d33b6f10e2352a3379b38d5b3bfaa4d00 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Mon, 25 Mar 2024 15:01:49 -0400 Subject: [PATCH 3/3] A8-4-7: fix missing namechange --- cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll b/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll index f06da410c4..be7cd76bd2 100644 --- a/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll +++ b/cpp/autosar/src/rules/A8-4-7/TriviallyCopyableSmallType.qll @@ -12,11 +12,11 @@ int wordSize() { result = max(VoidPointerType v | | v.getSize()) } * Converts bytes to words */ bindingset[bytes] -int minWordsRequiredToRepresentBytes(int bytes) { result = (1.0*bytes / wordSize()).ceil() } +int minWordsRequiredToRepresentBytes(int bytes) { result = (1.0 * bytes / wordSize()).ceil() } class TriviallyCopyableSmallType extends Type { TriviallyCopyableSmallType() { isTriviallyCopyableType(this) and - exists(int size | size = this.getSize() | bytesToWords(size) <= 2) + exists(int size | size = this.getSize() | minWordsRequiredToRepresentBytes(size) <= 2) } }