`RULE-0-0-1`: "unreachable statement" false positives due to over-pruning of the control-flow graph
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 48/100
Línea de trabajo
Comience en el predicado personalizado isReachable de RULE-0-0-1 y siga BasicBlock.getAPredecessor(), possiblePredecessor, potentiallyReturningFunction y reachableRecursive. Reproduzca el informe con el ejemplo autocontenido de C++ usando CodeQL CLI 2.26.2 y, a continuación, verifique que las sentencias alcanzables en update() y run() ya no se notifiquen como inalcanzables.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Affected rules
RULE-0-0-1
Description
RULE-0-0-1 reports plainly reachable statements as unreachable. The query does not use the standard reachable predicate; it defines its own reachability walk over BasicBlock.getAPredecessor():
predicate isReachable(BasicBlock bb) {
bb = any(Function f).getEntryPoint()
or
isReachable(bb.getAPredecessor())
or
... // special cases for &&/||, ?:, catch blocks, constexpr if
}
BasicBlock.getAPredecessor() is derived from successors_adapted , One pruning step, possiblePredecessor, removes the control-flow graph edge after a FunctionCall unless the callee is classified as potentiallyReturningFunction. That classification is itself defined recursively in terms of the adapted control-flow graph (reachableRecursive).
When this circular analysis fails to prove that a function returns the edge after the call is dropped, the rest of the function becomes "unreachable", and the function's own exit point is then considered unreachable too. The function is consequently treated as noreturn, so callers have everything after the call flagged as well. The error cascades across the translation unit.
Environment: CodeQL CLI 2.26.2, codeql/misra-cpp-coding-standards 2.62.0 (cpp-all 5.0.0), C++17.
Example
Five false positives on this self-contained file: the if in update() and every statement in run() after the call to update().
#include <unordered_map>
namespace detail {
struct Error {
Error() noexcept = default;
};
template <typename E>
struct unexpected {
E error;
explicit unexpected(E e) noexcept : error(e) {}
};
template <typename T, typename E>
struct expected {
T value_{};
E error_{};
bool has_value_ = true;
expected(T v) noexcept : value_(v), has_value_(true) {}
expected(unexpected<E> u) noexcept : error_(u.error), has_value_(false) {}
explicit operator bool() const noexcept { return has_value_; }
};
} // namespace detail
using Error = detail::Error;
using Unexpected = detail::unexpected<Error>;
template <typename T> using Result = detail::expected<T, Error>;
Result<int> update(const std::unordered_map<int, int>& keys) noexcept {
auto it = keys.find(0);
if (it == keys.end()) { // flagged as unreachable
return Result<int>{Unexpected{Error{}}};
}
return Result<int>{it->second};
}
void run() noexcept {
std::unordered_map<int, int> keys;
auto r = update(keys); // flagged as unreachable
if (r) { // flagged as unreachable
(void)0; // flagged as unreachable
}
int x = 42; // flagged as unreachable
(void)x;
}
- Lenguaje dominante
- CodeQL
- Estrellas
- 227
- Forks
- 82
- Merge medio
- 6 d 7 h
- PR fusionados (30 d)
- 9
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de github/codeql-coding-standards
-
false positive/false negative Stardard-MISRA-C++
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
github/codeql-coding-standards#1172 ·
-
Difficulty-Low false positive/false negative false-negative Impact-Low Standard-MISRA-C
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
Difficulty-Medium false positive/false negative false-positive Impact-Medium Standard-CERT-C
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
github/codeql-coding-standards#1200 ·
-
false positive/false negative
Dificultad 3/5 1-2 días Aptitud para principiantes 65/100
github/codeql-coding-standards#1175 ·
-
false positive/false negative Stardard-MISRA-C++
Dificultad 3/5 1-2 días Aptitud para principiantes 48/100
github/codeql-coding-standards#1165 ·
Todos los issues de github/codeql-coding-standards
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
danielmiessler/LifeOS#2218 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
hemilabs/ui-monorepo#2332 ·
-
Help-Wanted Needs-Triage Package-Update
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
microsoft/winget-pkgs#438662 ·
-
priority: p3
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
googleapis/librarian#7636 ·