Implicit Reference Capture verbieten



  • Hallo,
    in meiner Firma wird regelmäßig solcher Code geschrieben:

    std::future<int> foo(int a)
    {
        return std::async(std::launch::async, [&](){
            return a + 1;
        });
    }
    

    Das Tückische ist hier das implicit reference capture des Parameters a, das an Gültigkeit verliert, sobald die Funktion zurückspringt. Das Ergebnis ist somit vom Zufall abhängig und das hat immer wieder zu Bugs geführt. Nun suche ich nach einer Möglichkeit implicit captures per Compiler-Option zu verbieten.
    Ist das möglich?

    Danke im Voraus.



  • @Steffo sagte in Implicit Reference Capture verbieten:

    per Compiler-Option zu verbieten

    Welche Information glaubst Du könnte wichtig sein um diese Frage beantworten zu können?



  • Ich verstehe die Frage nicht, aber ich hab das jetzt mit Git Hooks gelöst, wo ein Python-Skript den Quellcode parst.



  • @Steffo sagte in Implicit Reference Capture verbieten:

    Ich verstehe die Frage nicht,

    Die Auskunft, um welchen Compiler es geht, ist sicher gemeint 😉



  • @Steffo sagte in Implicit Reference Capture verbieten:

    Ich verstehe die Frage nicht, aber ich hab das jetzt mit Git Hooks gelöst, wo ein Python-Skript den Quellcode parst.

    Hm, bist du sicher, dass es eine gute Idee ist, generell [&] zu verbieten? Oder auch [&a]? Und kannst du mit dem Python-Script C++ korrekt parsen? (wenn, dann hätte ich eher an sowas wie einen clang-tidy-check gedacht - es scheint aber bislang keinen Check zu geben, der das erkennen kann).


  • Mod

    Es ist quasi unmöglich, willkürliche Sprachfeatures zu unterbinden.

    Ich bin ziemlich sicher, dass jeder vernuenftige Compiler (unter Beigabe entsprechender Flags, bpsw. -Wall -Wextra) dir heutzutage eine Warnung ausstellt. Falls nicht, kann man einen statisches Analysetool einbinden.



  • @wob sagte in Implicit Reference Capture verbieten:

    Hm, bist du sicher, dass es eine gute Idee ist, generell [&] zu verbieten? Oder auch [&a]? Und kannst du mit dem Python-Script C++ korrekt parsen? (wenn, dann hätte ich eher an sowas wie einen clang-tidy-check gedacht - es scheint aber bislang keinen Check zu geben, der das erkennen kann).

    Das Capturen von expliziten Variablen ist weiterhin erlaubt. Also [&a] ist weiterhin erlaubt, würde aber im obigen Beispiel zu demselben Fehler führen. Nur wird [&] sehr oft gedankenlos verwendet. - Das ist zumindest eine Beobachtung in unserem Projekt, weswegen ich das verbieten wollte.
    Ich denke, es sprechen mehr Gründe dafür [&] zu verbieten als es zu erlauben.
    Das Parsen scheint gut zu funktionieren, ansonsten kann man den regulären Ausdruck ja immer noch anpassen.



  • @Columbo sagte in Implicit Reference Capture verbieten:

    Es ist quasi unmöglich, willkürliche Sprachfeatures zu unterbinden.

    Ich bin ziemlich sicher, dass jeder vernuenftige Compiler (unter Beigabe entsprechender Flags, bpsw. -Wall -Wextra) dir heutzutage eine Warnung ausstellt. Falls nicht, kann man einen statisches Analysetool einbinden.

    Ich habe diesbezüglich wirklich gar nichts gefunden.



  • Ich habe den Code auch durch clang-tidy --checks=\* (Version 11.0.0) gejagt, aber nichts (außer Irrelevantes ausm llvm-codestyle-Bereich (llvmlibc-callee-namespace) sowie dem modernize-use-trailing-return-type).



  • Ich glaube das Problem ist dass eine nicht gerade triviale lifetime Analyse nötig wäre um hier eine Warnung zu generieren. Also wenn man eine "dangling pointer" oder "dangling reference" Warnung erwartet. Eine Warnung ala bitte kein [&] verwenden wäre natürlich einfach zu implementieren. Andrerseits gibt's halt auch Anwendungsfälle wo [&] praktisch und gleichzeitig ungefährlich ist.



  • Ich habe das Skript mal GitHub veröffentlicht.


Log in to reply