Microsoft's Lifetime Checker schon getestet?



  • Mich würde interessieren, ob es hier Leute gibt, die den Checker schon ausprobiert haben. Ich selbst benutze kein Visual Studio.

    Kann er z.B. so etwas abfangen?

    #include <string>
    #include <string_view>
    #include <iostream>
    
    std::string source() {
        std::string test = "  hello  ";
        return test;
    }
    
    std::string_view trim(std::string_view s) {
        while (!s.empty() && std::isspace(s.front())) s.remove_prefix(1);
        while (!s.empty() && std::isspace(s.back()))  s.remove_suffix(1);
        return s;
    }
    
    int main() {
        auto h = trim(source());
        // h ist hier schon ungültig, da der temporäre String verschwunden ist.
        std::cout << h << '\n';
    }
    

    Vielen Dank im Voraus. 🙂



  • Hey,

    also ich hab VS Community 2017, musste ihn zuerst aktivieren. Hab dann das Beispiel genommen:

    // CoreCheckExample.cpp  
    // Add CppCoreCheck package and enable code analysis in build for warnings.  
    
    int main()  
    {  
        int arr[10];           // warning C26494  
        int* p = arr;          // warning C26485  
    
        {  
            int* q = p + 1;    // warning C26481 
            p = q++;           // warning C26481  
        }  
    
        return 0;  
    }
    

    Der Checker gibt mir dann die 4 Warnungen aus.

    Bei deinem Beispiel bekomme ich jedoch 0 Warnungen. Selbst wenn ich die Checker-Analyse Stufe hoch auf "All Rules" stelle, kommt keine Warnung.



  • Danke für's Testen! 🙂

    Bist Du sicher, dass Du wirklich den Lifetime-Checker ausprobiert hast und nicht etwas anderes? Das ist ja ernüchternd. Es gibt wohl genügend andere Baustellen. Oder ... es ist schwieriger, eine Lösung für Lifetime Safety an C++ dran zu flanschen, als sich das Stroustrup und Sutter dachten.



  • krümelkacker schrieb:

    Bist Du sicher, dass Du wirklich den Lifetime-Checker ausprobiert hast und nicht etwas anderes? Das ist ja ernüchternd. Es gibt wohl genügend andere Baustellen.

    Joa, bin mir sicher. Das Teil heißt C++ Core Guidelines Checkers. In den Projekteigenschaften steht ganz unten "Code Analysis" und ich kann auswählen "C++ Core Check Released" oder "C++ Core Check Experimental". Zusätzlich kann ich noch auswählen, auf welchen Regeln die Analyse passieren soll:

    These rules focus on the most critical and common problems in your native code, including potential security holes and application crashes. You should include this rule set in any custom rule set you create for your native projects.

    Aber egal welche Regel ich auswähle und egal ob Released oder Experimental, bei deinem Code gibt es nie eine Warnung :p



  • Ich glaube, seit C++11 hat sich was von wegen der Lebenszeit temporärer Objekte getan, womöglich trifft das hier zu. Ich schau mal genauer nach.



  • Manche Warnings finde ich seltsam, z.B. diese:

    int main( )
    {
    	int arr[ 10 ];
    	int* p = arr;  // Warning	C26485	Expression 'arr': No array to pointer decay.
    }
    

    Was soll das heißen? No array to pointer decay, was soll es sonst sein?



  • Achja, hier sind übrigens die Guideliens:
    http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines.html



  • out schrieb:

    Manche Warnings finde ich seltsam, z.B. diese:

    int main( )
    {
    	int arr[ 10 ];
    	int* p = arr;  // Warning	C26485	Expression 'arr': No array to pointer decay.
    }
    

    Was soll das heißen? No array to pointer decay, was soll es sonst sein?

    Stattdessen sollst Du span<int> benutzen. Ein span<> vereint einen Zeiger auf das erste Element mit einer Längeninformation. Als solches, kann es bounds checking zur Laufzeit durchführen (mindestens im Debug-Modus) und sollte insgesamt weniger fehleranfällig sein.


Anmelden zum Antworten