MarcusJohnson91 updated this revision to Diff 361409. MarcusJohnson91 marked an inline comment as done. MarcusJohnson91 added a comment.
#1: Moved a comment to the top, so it's brettier 😊 #2: Moved all the ugly StringLiteral conversion code to StringLiteral::getStrDataAsChar and forwarded that function to FormatStringLiteral::getStrDataAsChar CHANGES SINCE LAST ACTION https://reviews.llvm.org/D103426/new/ https://reviews.llvm.org/D103426 Files: clang/lib/AST/OSLog.cpp clang/lib/Sema/SemaChecking.cpp clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
Index: clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp +++ clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp @@ -785,28 +785,10 @@ // Currently we only handle (not wide) string literals. It is possible to do // better, either by looking at references to const variables, or by doing // real flow analysis. - std::string String; auto FormatString = dyn_cast<StringLiteral>(CE->getArg(ArgIndex)->IgnoreParenImpCasts()); - StringLiteral::StringKind Kind = FormatString->getKind(); - - if (Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) { - String = FormatString->getStringAsChar(); - } else if (Kind == StringLiteral::UTF16) { - std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert; - std::u16string U16 = FormatString->getStringAsChar16(); - String = Convert.to_bytes(U16); - } else if (Kind == StringLiteral::UTF32) { - std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert; - std::u32string U32 = FormatString->getStringAsChar32(); - String = Convert.to_bytes(U32); - } else if (Kind == StringLiteral::Wide) { - std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert; - std::wstring WChar = FormatString->getStringAsWChar(); - String = Convert.to_bytes(WChar); - } - + std::string String(FormatString->getStrDataAsChar()); StringRef StrRef = StringRef(String); if (FormatString && Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -622,25 +622,7 @@ auto *FormatExpr = TheCall->getArg(FormatIndex)->IgnoreParenImpCasts(); if (auto *Format = dyn_cast<StringLiteral>(FormatExpr)) { - StringLiteral::StringKind Kind = Format->getKind(); - std::string String; - - if (Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) { - String = Format->getStringAsChar(); - } else if (Kind == StringLiteral::UTF16) { - std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert; - std::u16string U16 = Format->getStringAsChar16(); - String = Convert.to_bytes(U16); - } else if (Kind == StringLiteral::UTF32) { - std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert; - std::u32string U32 = Format->getStringAsChar32(); - String = Convert.to_bytes(U32); - } else if (Kind == StringLiteral::Wide) { - std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert; - std::wstring WChar = Format->getStringAsWChar(); - String = Convert.to_bytes(WChar); - } - + std::string String(Format->getStrDataAsChar()); StringRef FormatStrRef(String); EstimateSizeFormatHandler H(FormatStrRef); @@ -7481,6 +7463,10 @@ return FExpr->getString().drop_front(Offset); } + const char *getStrDataAsChar() const { + return FExpr->getStrDataAsChar(); + } + std::string getStringAsChar() const { return FExpr->getStringAsChar(); } @@ -9538,24 +9524,7 @@ /*IsStringLocation*/ true, OrigFormatExpr->getSourceRange()); return; } - StringLiteral::StringKind Kind = FExpr->getKind(); - std::string String; - - if (Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) { - String = FExpr->getStringAsChar(); - } else if (Kind == StringLiteral::UTF16) { - std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert; - std::u16string U16 = FExpr->getStringAsChar16(); - String = Convert.to_bytes(U16); - } else if (Kind == StringLiteral::UTF32) { - std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert; - std::u32string U32 = FExpr->getStringAsChar32(); - String = Convert.to_bytes(U32); - } else if (Kind == StringLiteral::Wide) { - std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert; - std::wstring WChar = FExpr->getStringAsWChar(); - String = Convert.to_bytes(WChar); - } + std::string String(FExpr->getStrDataAsChar()); StringRef StrRef(String); const char *Str = StrRef.data(); @@ -9626,25 +9595,7 @@ assert(T && "String literal not of constant array type!"); size_t TypeSize = T->getSize().getZExtValue(); - StringLiteral::StringKind Kind = FExpr->getKind(); - std::string String; - - if (Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) { - String = FExpr->getStringAsChar(); - } else if (Kind == StringLiteral::UTF16) { - std::u16string U16 = FExpr->getStringAsChar16(); - std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert; - String = Convert.to_bytes(U16); - } else if (Kind == StringLiteral::UTF32) { - std::u32string U32 = FExpr->getStringAsChar32(); - std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert; - String = Convert.to_bytes(U32); - } else if (Kind == StringLiteral::Wide) { - std::wstring WChar = FExpr->getStringAsWChar(); - std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert; - String = Convert.to_bytes(WChar); - } - + std::string String(FExpr->getStrDataAsChar()); StringRef StrRef(String); const char *Str = StrRef.data(); Index: clang/lib/AST/OSLog.cpp =================================================================== --- clang/lib/AST/OSLog.cpp +++ clang/lib/AST/OSLog.cpp @@ -205,23 +205,6 @@ const StringLiteral *Lit = cast<StringLiteral>(StringArg->IgnoreParenCasts()); assert(Lit); std::string String(Lit->getStrDataAsChar()); - /* - if (Lit->isAscii() || Lit->isUTF8()) { - String = Lit->getStringAsChar(); - } else if (Lit->isUTF16()) { - std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert; - std::u16string U16 = Lit->getStringAsChar16(); - String = Convert.to_bytes(U16); - } else if (Lit->isUTF32()) { - std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert; - std::u32string U32 = Lit->getStringAsChar32(); - String = Convert.to_bytes(U32); - } else if (Lit->isWide()) { - std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert; - std::wstring WChar = Lit->getStringAsWChar(); - String = Convert.to_bytes(WChar); - } - */ StringRef Data(String); OSLogFormatStringHandler H(VarArgs);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits