undefined behavior in gcd when parameters are minimum values of signed integers
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 45/100
Rechercherichtung
Beginnen Sie in common_factor_rt.hpp bei der gcd-Vorlage um die Zeilen 444–451 und reproduzieren Sie den Aufruf, wobei beide vorzeichenbehafteten Parameter auf std::numeric_limits::min() gesetzt werden. Verfolgen Sie den rekursiven Pfad und überprüfen Sie, dass der Fall mit dem Minimalwert nicht mehr eine Modulo-Operation mit null erreicht. Fügen Sie eine Regressionstestabdeckung hinzu oder aktualisieren Sie sie, falls das Repository einen relevanten gcd-Testort bereitstellt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
This is being reported to me via a clang-analyzer check, and it refers to the gcd template function in common_factor_rt.hpp
Integer template parameter type is a signed integer, and both parameters ('a' and 'b') are std::numeric_limits<Integer>::min.
444 template <typename Integer>
445 inline BOOST_CXX14_CONSTEXPR Integer gcd(Integer const &a, Integer const &b) BOOST_GCD_NOEXCEPT(Integer)
446 {
447 if(a == (std::numeric_limits<Integer>::min)())
448 return a == static_cast<Integer>(0) ? gcd_detail::gcd_traits<Integer>::abs(b) : boost::integer::gcd(static_cast<Integer>(a % b), b);
449 else if (b == (std::numeric_limits<Integer>::min)())
450 return b == static_cast<Integer>(0) ? gcd_detail::gcd_traits<Integer>::abs(a) : boost::integer::gcd(a, static_cast<Integer>(b % a));
451 return gcd_detail::optimal_gcd_select(static_cast<Integer>(gcd_detail::gcd_traits<Integer>::abs(a)), static_cast<Integer>(gcd_detail::gcd_traits<Integer>::abs(b)));
452 }
In the initial invocation, the condition on 447 is true, and the condition on 448 is false. This leads to a recursive call to the function with parameters a=0 and b=std::numeric_limits<Integer>::min.
In the recursive call, the condition on 447 is false, the condition on 449 is true, and the condition on 450 is false. Another recursive call is on-deck with a=0 and b=b%a, But a is zero at this point. Anything mod 0 is undefined behavior.
My suggested fix is to check if a and b are the same value at the start of the function, and return a right away.
- Vorherrschende Sprache
- C++
- Sterne
- 19
- Forks
- 58
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
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.
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
objectionary/eo-graphs#80 ·
-
bug C/C++ code
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 78/100
webarkit/WebARKitLib#85 ·
Maintainer antworten meist innerhalb von 1 Tag
-
SD Card Size correctionOffen
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 72/100
-
[request] vsg/1.1.16Offenupstream update
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
conan-io/conan-center-index#31142 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100