`A4-7-1`: false positives in for loops
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 28/100
Rechercherichtung
Beginnen Sie damit, die CodeQL-Abfrage für die betroffene Regel A4-7-1 zu finden und ihr Verhalten mit den C++-Beispielen in diesem Issue zu vergleichen. Die Arbeit ist abgeschlossen, wenn die gezeigten Fälle mit Schleifenzählern, begrenzten Iterationen, Containergrößen und Hilfsspannen keine False Positives mehr erzeugen, während echte Überlaufrisiken weiterhin gemeldet werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Affected rules
A4-7-1
Description
Typical increment by one in for loops cannot lead to overflow or wrap-around because the number of iterations isn't large enough. The example illustrates true negatives together with false positives:
- in
fthe variable used as "loop counter" is defined inside or outside the scope of the loop, - and in
gthe number of iterations changes by a factor 100, although still not close to int limit - in general I think a query should take into account, if possible, the value used to initialize the counter and the (potential maximum) number of iterations. - iterating through a container through an auxiliary span of its values (rather than through the container directly).
Example
#include <array>
void f() {
const int num_iter = 100000;
for (int i = 0; i < num_iter; i++) { // OK.
;
}
int j = 0;
for (; j < num_iter; j++) { // False Positive.
;
}
}
void g() {
constexpr int N1000 = 1000;
std::array<int, N1000> arr1000;
std::size_t idx = 0;
for (; idx < arr1000.size(); ++idx) { // OK.
;
}
constexpr int N100000 = 100000;
std::array<int, N100000> arr100000;
idx = 0;
for (; idx < arr100000.size(); ++idx) { // False Positive.
;
}
}
namespace {
// AUTOSAR is C++14, so a quick C++20's span:
template<typename T>
class span
{
public:
span(T* data, std::size_t s) : data_member(data), size_(s) {}
std::size_t size() { return size_; }
private:
T* data_member;
std::size_t size_;
};
// This could be a member (non-template) function in a custom (template) container.
template<typename Container>
constexpr span<typename Container::value_type> values(Container& c) {
return {c.data(), c.size()};
}
}
int main() {
constexpr int N = 1;
std::array<int, N> arr;
auto values = ::values(arr);
std::size_t idx = 0;
for (; idx < values.size(); ++idx) { // False Positive.
; // Avoid assuming N is declared in the same scope, but OK that it is a
// std::size_t NTTP and/or data member of the container argument to values().
}
}
- Vorherrschende Sprache
- CodeQL
- Sterne
- 227
- Forks
- 82
- Ø Merge
- 6 T. 7 Std.
- Gemergte PRs (30 T.)
- 9
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus github/codeql-coding-standards
-
false positive/false negative Stardard-MISRA-C++
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
github/codeql-coding-standards#1172 ·
-
Difficulty-Low false positive/false negative false-negative Impact-Low Standard-MISRA-C
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
-
Difficulty-Medium false positive/false negative false-positive Impact-Medium Standard-CERT-C
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
github/codeql-coding-standards#1200 ·
-
`RULE-0-0-1`: "unreachable statement" false positives due to over-pruning of the control-flow graph Offenfalse positive/false negative
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
github/codeql-coding-standards#1190 ·
-
false positive/false negative
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 65/100
github/codeql-coding-standards#1175 ·
Alle Issues in github/codeql-coding-standards
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
palladius/rails8-app-on-gcp#145 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
elastic/gradle-plugins#156 ·
-
area:workflow bug ready-for-agent
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
fil-donadoni/tolaria#4409 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
dotenvx/dotenv-vscode#139 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Fission-AI/OpenSpec#1960 ·