⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testtokenize.cpp

📁 cppcheck is a static C/C++ code analyzer that checks for memory leaks, mismatching allocation-deallo
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* * Cppcheck - A tool for static C/C++ code analysis * Copyright (C) 2007-2009 Daniel Marjamäki, Reijo Tomperi, Nicolas Le Cam, * Leandro Penz, Kimmo Varis, Vesa Pikki * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program.  If not, see <http://www.gnu.org/licenses/ */// The preprocessor that c++check uses is a bit special. Instead of generating// the code for a known configuration, it generates the code for each configuration.#include <cstring>#include "testsuite.h"#include "../src/tokenize.h"extern std::ostringstream errout;class TestTokenizer : public TestFixture{public:    TestTokenizer() : TestFixture("TestTokenizer")    { }    class OurTokenizer : public Tokenizer    {    public:        void simplifyCasts()        {            Tokenizer::simplifyCasts();        }        bool simplifyIfAddBraces()        {            return Tokenizer::simplifyIfAddBraces();        }        bool simplifyKnownVariables()        {            return Tokenizer::simplifyKnownVariables();        }        std::vector<const Token *> &getFunctionList()        {            return _functionList;        }    };private:    void run()    {        TEST_CASE(longtok);        TEST_CASE(removeCast1);        TEST_CASE(inlineasm);        TEST_CASE(dupfuncname);        TEST_CASE(const_and_volatile_functions);        TEST_CASE(ifAddBraces1);        TEST_CASE(ifAddBraces2);        TEST_CASE(ifAddBraces3);        TEST_CASE(ifAddBraces4);        TEST_CASE(numeric_true_condition);        TEST_CASE(simplifyKnownVariables1);        TEST_CASE(simplifyKnownVariables2);        TEST_CASE(simplifyKnownVariables3);        TEST_CASE(simplifyKnownVariables4);        TEST_CASE(simplifyKnownVariables5);        TEST_CASE(simplifyKnownVariables6);        TEST_CASE(simplifyKnownVariables7);        TEST_CASE(simplifyKnownVariables8);        TEST_CASE(multiCompare);        TEST_CASE(match1);        TEST_CASE(match2);        TEST_CASE(varid1);        TEST_CASE(varid2);        TEST_CASE(varid3);        TEST_CASE(varid4);        TEST_CASE(varid5);        // TODO TEST_CASE(varid6);      // Function parameters aren't handled well yet        TEST_CASE(varid7);        TEST_CASE(varidReturn);        TEST_CASE(file1);        TEST_CASE(file2);        TEST_CASE(file3);        TEST_CASE(doublesharp);        TEST_CASE(macrodoublesharp);        TEST_CASE(simplify_function_parameters);        TEST_CASE(reduce_redundant_paranthesis);        // Ticket #61        TEST_CASE(simplify_numeric_condition);        TEST_CASE(tokenize_double);        TEST_CASE(tokenize_strings);        TEST_CASE(simplify_constants);        TEST_CASE(simplify_constants2);    }    bool cmptok(const char *expected[], const Token *actual)    {        unsigned int i = 0;        for (; expected[i] && actual; ++i, actual = actual->next())        {            if (strcmp(expected[i], actual->aaaa()) != 0)                return false;        }        return (expected[i] == NULL && actual == NULL);    }    std::string tokenizeAndStringify(const char code[])    {        // tokenize..        Tokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        std::ostringstream ostr;        for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())        {            ostr << tok->str();            // Append newlines            if (tok->next())            {                if (tok->linenr() != tok->next()->linenr())                {                    for (unsigned int i = tok->linenr();i < tok->next()->linenr();++i)                        ostr << "\n";                }                else                {                    ostr << " ";                }            }        }        return ostr.str();    }    void longtok()    {        std::string filedata(10000, 'a');        // tokenize..        Tokenizer tokenizer;        std::istringstream istr(filedata);        tokenizer.tokenize(istr, "test.cpp");        // Expected result..        ASSERT_EQUALS(std::string(10000, 'a'), std::string(tokenizer.tokens()->aaaa()));    }    // Dont remove "(int *)"..    void removeCast1()    {        const char code[] = "int *f(int *);";        // tokenize..        OurTokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        tokenizer.simplifyCasts();        std::ostringstream ostr;        for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())            ostr << " " << tok->str();        ASSERT_EQUALS(std::string(" int * f ( int * ) ;"), ostr.str());    }    void inlineasm()    {        const char filedata[] = "void foo()\n"                                "{\n"                                "    __asm\n"                                "    {\n"                                "        jmp $jump1\n"                                "        $jump1:\n"                                "    }\n"                                "}\n";        // tokenize..        Tokenizer tokenizer;        std::istringstream istr(filedata);        tokenizer.tokenize(istr, "test.cpp");        // Expected result..        const char *expected[] =        {            "void",            "foo",            "(",            ")",            "{",            "}",            0        };        // Compare..        ASSERT_EQUALS(true, cmptok(expected, tokenizer.tokens()));    }    void dupfuncname()    {        const char code[] = "void a()\n"                            "{ }\n"                            "void a(int i)\n"                            "{ }\n"                            "void b()\n"                            "{ }\n";        // tokenize..        OurTokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        tokenizer.fillFunctionList();        ASSERT_EQUALS(1, static_cast<unsigned int>(tokenizer.getFunctionList().size()));        ASSERT_EQUALS(std::string("b"), tokenizer.getFunctionList()[0]->aaaa());    }    void const_and_volatile_functions()    {        const char code[] = "class B\n\                            {\n\                            public:\n\                            void a();\n\                            void b() const;\n\                            void c() volatile;\n\                            };\n\                            \n\                            void B::a()\n\                            {}\n\                            \n\                            void B::b() const\n\                            {}\n\                            \n\                            void B::c() volatile\n\                            {}\n";        // tokenize..        OurTokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        tokenizer.fillFunctionList();        ASSERT_EQUALS(3, static_cast<unsigned int>(tokenizer.getFunctionList().size()));        if (tokenizer.getFunctionList().size() == 3)        {            ASSERT_EQUALS(std::string("a"), tokenizer.getFunctionList()[0]->str());            ASSERT_EQUALS(std::string("b"), tokenizer.getFunctionList()[1]->str());            ASSERT_EQUALS(std::string("c"), tokenizer.getFunctionList()[2]->str());        }    }    void numeric_true_condition()    {        const char code[] = "void f()\n"                            "{\n"                            "    if (5==5);\n"                            "}\n";        // tokenize..        Tokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        tokenizer.simplifyTokenList();        std::ostringstream ostr;        for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())            ostr << " " << tok->str();        ASSERT_EQUALS(std::string(" void f ( ) { { ; } }"), ostr.str());    }    void ifAddBraces1()    {        const char code[] = "void f()\n"                            "{\n"                            "    if (a);\n"                            "    else ;\n"                            "}\n";        // tokenize..        OurTokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        ASSERT_EQUALS(true, tokenizer.simplifyIfAddBraces());        std::ostringstream ostr;        for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())            ostr << " " << tok->str();        ASSERT_EQUALS(std::string(" void f ( ) { if ( a ) { ; } else { ; } }"), ostr.str());    }    void ifAddBraces2()    {        const char code[] = "void f()\n"                            "{\n"                            "    if (a) if (b) { }\n"                            "}\n";        // tokenize..        OurTokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        ASSERT_EQUALS(true, tokenizer.simplifyIfAddBraces());        std::ostringstream ostr;        for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())            ostr << " " << tok->str();        ASSERT_EQUALS(std::string(" void f ( ) { if ( a ) { if ( b ) { } } }"), ostr.str());    }    void ifAddBraces3()    {        const char code[] = "void f()\n"                            "{\n"                            "    if (a) for (;;) { }\n"                            "}\n";        // tokenize..        OurTokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        ASSERT_EQUALS(true, tokenizer.simplifyIfAddBraces());        std::ostringstream ostr;        for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())            ostr << " " << tok->str();        ASSERT_EQUALS(std::string(" void f ( ) { if ( a ) { for ( ; ; ) { } } }"), ostr.str());    }    void ifAddBraces4()    {        const char code[] = "char * foo ()\n"                            "{\n"                            "    char *str = malloc(10);\n"                            "    if (somecondition)\n"                            "        for ( ; ; )\n"                            "        { }\n"                            "    return str;\n"                            "}\n";        // tokenize..        OurTokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        ASSERT_EQUALS(true, tokenizer.simplifyIfAddBraces());        std::ostringstream ostr;        for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())            ostr << " " << tok->str();        ASSERT_EQUALS(std::string(" char * foo ( ) { char * str = malloc ( 10 ) ; if ( somecondition ) { for ( ; ; ) { } } return str ; }"), ostr.str());    }    void simplifyKnownVariables1()    {        const char code[] = "void f()\n"                            "{\n"                            "    int a = 10;\n"                            "    if (a);\n"                            "}\n";        // tokenize..        OurTokenizer tokenizer;        std::istringstream istr(code);        tokenizer.tokenize(istr, "test.cpp");        tokenizer.setVarId();        tokenizer.simplifyKnownVariables();        std::ostringstream ostr;        for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())            ostr << " " << tok->str();        ASSERT_EQUALS(std::string(" void f ( ) { int a = 10 ; if ( 10 ) ; }"), ostr.str());    }    void simplifyKnownVariables2()    {        const char code[] = "void f()\n"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -