initial commit
This commit is contained in:
commit
8385bbb030
7 changed files with 562 additions and 0 deletions
297
.clang-format
Normal file
297
.clang-format
Normal file
|
|
@ -0,0 +1,297 @@
|
|||
---
|
||||
Language: Cpp
|
||||
AccessModifierOffset: -2
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignArrayOfStructures: None
|
||||
AlignConsecutiveAssignments:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionDeclarations: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: true
|
||||
AlignConsecutiveBitFields:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionDeclarations: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignConsecutiveDeclarations:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionDeclarations: true
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignConsecutiveMacros:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionDeclarations: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignConsecutiveShortCaseStatements:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCaseArrows: false
|
||||
AlignCaseColons: false
|
||||
AlignConsecutiveTableGenBreakingDAGArgColons:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionDeclarations: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignConsecutiveTableGenCondOperatorColons:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionDeclarations: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignConsecutiveTableGenDefinitionColons:
|
||||
Enabled: false
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: false
|
||||
AlignFunctionDeclarations: false
|
||||
AlignFunctionPointers: false
|
||||
PadOperators: false
|
||||
AlignEscapedNewlines: Right
|
||||
AlignOperands: Align
|
||||
AlignTrailingComments:
|
||||
Kind: Always
|
||||
OverEmptyLines: 0
|
||||
AllowAllArgumentsOnNextLine: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowBreakBeforeNoexceptSpecifier: Never
|
||||
AllowShortBlocksOnASingleLine: Never
|
||||
AllowShortCaseExpressionOnASingleLine: true
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortCompoundRequirementOnASingleLine: true
|
||||
AllowShortEnumsOnASingleLine: true
|
||||
AllowShortFunctionsOnASingleLine: All
|
||||
AllowShortIfStatementsOnASingleLine: Never
|
||||
AllowShortLambdasOnASingleLine: All
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AllowShortNamespacesOnASingleLine: false
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AttributeMacros:
|
||||
- __capability
|
||||
BinPackArguments: true
|
||||
BinPackLongBracedList: true
|
||||
BinPackParameters: BinPack
|
||||
BitFieldColonSpacing: Both
|
||||
BracedInitializerIndentWidth: -1
|
||||
BraceWrapping:
|
||||
AfterCaseLabel: false
|
||||
AfterClass: false
|
||||
AfterControlStatement: Never
|
||||
AfterEnum: false
|
||||
AfterExternBlock: false
|
||||
AfterFunction: false
|
||||
AfterNamespace: false
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: false
|
||||
AfterUnion: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
BeforeLambdaBody: false
|
||||
BeforeWhile: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: true
|
||||
SplitEmptyRecord: true
|
||||
SplitEmptyNamespace: true
|
||||
BreakAdjacentStringLiterals: true
|
||||
BreakAfterAttributes: Leave
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakAfterReturnType: None
|
||||
BreakArrays: true
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeConceptDeclarations: Always
|
||||
BreakBeforeBraces: Attach
|
||||
BreakBeforeInlineASMColon: OnlyMultiline
|
||||
BreakBeforeTemplateCloser: false
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakBinaryOperations: Never
|
||||
BreakConstructorInitializers: BeforeColon
|
||||
BreakFunctionDefinitionParameters: false
|
||||
BreakInheritanceList: BeforeColon
|
||||
BreakStringLiterals: true
|
||||
BreakTemplateDeclarations: MultiLine
|
||||
ColumnLimit: 80
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
CompactNamespaces: false
|
||||
ConstructorInitializerIndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
EmptyLineAfterAccessModifier: Never
|
||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||
EnumTrailingComma: Leave
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
FixNamespaceComments: true
|
||||
ForEachMacros:
|
||||
- foreach
|
||||
- Q_FOREACH
|
||||
- BOOST_FOREACH
|
||||
IfMacros:
|
||||
- KJ_IF_MAYBE
|
||||
IncludeBlocks: Preserve
|
||||
IncludeCategories:
|
||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||
Priority: 2
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
||||
Priority: 3
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '.*'
|
||||
Priority: 1
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
IncludeIsMainRegex: '(Test)?$'
|
||||
IncludeIsMainSourceRegex: ''
|
||||
IndentAccessModifiers: false
|
||||
IndentCaseBlocks: false
|
||||
IndentCaseLabels: false
|
||||
IndentExportBlock: true
|
||||
IndentExternBlock: AfterExternBlock
|
||||
IndentGotoLabels: true
|
||||
IndentPPDirectives: None
|
||||
IndentRequiresClause: true
|
||||
IndentWidth: 2
|
||||
IndentWrappedFunctionNames: false
|
||||
InsertBraces: false
|
||||
InsertNewlineAtEOF: false
|
||||
InsertTrailingCommas: None
|
||||
IntegerLiteralSeparator:
|
||||
Binary: 0
|
||||
BinaryMinDigits: 0
|
||||
Decimal: 0
|
||||
DecimalMinDigits: 0
|
||||
Hex: 0
|
||||
HexMinDigits: 0
|
||||
JavaScriptQuotes: Leave
|
||||
JavaScriptWrapImports: true
|
||||
KeepEmptyLines:
|
||||
AtEndOfFile: false
|
||||
AtStartOfBlock: true
|
||||
AtStartOfFile: true
|
||||
KeepFormFeed: false
|
||||
LambdaBodyIndentation: Signature
|
||||
LineEnding: DeriveLF
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MainIncludeChar: Quote
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
ObjCBinPackProtocolList: Auto
|
||||
ObjCBlockIndentWidth: 2
|
||||
ObjCBreakBeforeNestedBlockParam: true
|
||||
ObjCSpaceAfterProperty: false
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
OneLineFormatOffRegex: ''
|
||||
PackConstructorInitializers: BinPack
|
||||
PenaltyBreakAssignment: 2
|
||||
PenaltyBreakBeforeFirstCallParameter: 19
|
||||
PenaltyBreakBeforeMemberAccess: 150
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakOpenParenthesis: 0
|
||||
PenaltyBreakScopeResolution: 500
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyBreakTemplateDeclaration: 10
|
||||
PenaltyExcessCharacter: 1000000
|
||||
PenaltyIndentedWhitespace: 0
|
||||
PenaltyReturnTypeOnItsOwnLine: 60
|
||||
PointerAlignment: Right
|
||||
PPIndentWidth: -1
|
||||
QualifierAlignment: Leave
|
||||
ReferenceAlignment: Pointer
|
||||
ReflowComments: Always
|
||||
RemoveBracesLLVM: false
|
||||
RemoveEmptyLinesInUnwrappedLines: false
|
||||
RemoveParentheses: Leave
|
||||
RemoveSemicolon: false
|
||||
RequiresClausePosition: OwnLine
|
||||
RequiresExpressionIndentation: OuterScope
|
||||
SeparateDefinitionBlocks: Leave
|
||||
ShortNamespaceLines: 1
|
||||
SkipMacroDefinitionBody: false
|
||||
SortIncludes:
|
||||
Enabled: true
|
||||
IgnoreCase: false
|
||||
SortJavaStaticImport: Before
|
||||
SortUsingDeclarations: LexicographicNumeric
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterLogicalNot: false
|
||||
SpaceAfterOperatorKeyword: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceAroundPointerQualifiers: Default
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeCaseColon: false
|
||||
SpaceBeforeCpp11BracedList: false
|
||||
SpaceBeforeCtorInitializerColon: true
|
||||
SpaceBeforeInheritanceColon: true
|
||||
SpaceBeforeJsonColon: false
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceBeforeParensOptions:
|
||||
AfterControlStatements: true
|
||||
AfterForeachMacros: true
|
||||
AfterFunctionDefinitionName: false
|
||||
AfterFunctionDeclarationName: false
|
||||
AfterIfMacros: true
|
||||
AfterNot: false
|
||||
AfterOverloadedOperator: false
|
||||
AfterPlacementOperator: true
|
||||
AfterRequiresInClause: false
|
||||
AfterRequiresInExpression: false
|
||||
BeforeNonEmptyParentheses: false
|
||||
SpaceBeforeRangeBasedForLoopColon: true
|
||||
SpaceBeforeSquareBrackets: false
|
||||
SpaceInEmptyBlock: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: Never
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInLineCommentPrefix:
|
||||
Minimum: 1
|
||||
Maximum: -1
|
||||
SpacesInParens: Never
|
||||
SpacesInParensOptions:
|
||||
ExceptDoubleParentheses: false
|
||||
InCStyleCasts: false
|
||||
InConditionalStatements: false
|
||||
InEmptyParentheses: false
|
||||
Other: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Latest
|
||||
StatementAttributeLikeMacros:
|
||||
- Q_EMIT
|
||||
StatementMacros:
|
||||
- Q_UNUSED
|
||||
- QT_REQUIRE_VERSION
|
||||
TableGenBreakInsideDAGArg: DontBreak
|
||||
TabWidth: 8
|
||||
UseTab: Never
|
||||
VerilogBreakBetweenInstancePorts: true
|
||||
WhitespaceSensitiveMacros:
|
||||
- BOOST_PP_STRINGIZE
|
||||
- CF_SWIFT_NAME
|
||||
- NS_SWIFT_NAME
|
||||
- PP_STRINGIZE
|
||||
- STRINGIZE
|
||||
WrapNamespaceBodyWithEmptyLines: Leave
|
||||
...
|
||||
|
||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
build/
|
||||
34
AGENTS.md
Normal file
34
AGENTS.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
When you are asked to write code, do so in a minimal way. Try to emphasize
|
||||
clarity of expression in code above verbosity. For example, An array index used
|
||||
on every line of a loop needn't be named any more elaborately than i. Saying
|
||||
index or elementnumber is more to type (or calls upon your text editor) and
|
||||
obscures the details of the computation. As in all other aspects of readable
|
||||
programming, consistency is important in naming. If you call one variable
|
||||
maxphysaddr, don't call its cousin lowestaddress. Whenever there's a convention
|
||||
for something, follow it. The code should strive to be simple enough to be
|
||||
obviously bug free.
|
||||
|
||||
When code appears non-trivial, include a comment above the non-trivial section
|
||||
explaining the "why", not the "what" behind the code, with any references where
|
||||
a developer can read more about why code does something.
|
||||
|
||||
Be critical of any and all code, but whenever it makes sense do things the way
|
||||
we do it in other places throughout our codebase. Whenever you see something
|
||||
suspicious or shoddy, you should leave a comment marking it as so, and explain
|
||||
why. Each of these such comments should be marked with a `TODO`, explaining
|
||||
briefly what the issue is, and what might need to be done to fix it. Do not try
|
||||
to address many things at once, but always keep them in mind.
|
||||
|
||||
Whenever a requirement is unclear, you should ask for clarification.
|
||||
|
||||
clang-format is available, and should always be used to format code before
|
||||
considering it completed. clang-tidy is available, and should also be used.
|
||||
Code with any lint warnings or errors should not be considered complete. Some
|
||||
lint warnings are not really relevant, and if one seems to require some
|
||||
arbitrary fix which doesn't affect the quality or robustness of the code we
|
||||
will remove it, however you should always ask before disabling any checks.
|
||||
|
||||
CMake is used to build the project. The build directory is called `build`, and
|
||||
is likely already generated. You can regenerate it if needed, but this fetches
|
||||
and build LLVM, which is a very large dependency and takes a long time to
|
||||
compile so you should try to avoid doing so.
|
||||
83
CMakeLists.txt
Normal file
83
CMakeLists.txt
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
cmake_minimum_required(VERSION 3.20)
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
|
||||
endif()
|
||||
|
||||
project(errorck LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(REQUIRED_LLVM_VERSION "18.1.8" CACHE STRING "Required LLVM/Clang version")
|
||||
set(LLVM_ROOT "" CACHE PATH "Prefix containing lib/cmake/llvm and lib/cmake/clang")
|
||||
set(LLVM_TAG "llvmorg-18.1.8" CACHE STRING "llvm-project git tag/commit to fetch")
|
||||
|
||||
if(LLVM_ROOT)
|
||||
list(PREPEND CMAKE_PREFIX_PATH "${LLVM_ROOT}")
|
||||
endif()
|
||||
|
||||
find_package(LLVM CONFIG QUIET)
|
||||
find_package(Clang CONFIG QUIET)
|
||||
|
||||
if(LLVM_FOUND AND DEFINED LLVM_PACKAGE_VERSION AND NOT (LLVM_PACKAGE_VERSION VERSION_EQUAL REQUIRED_LLVM_VERSION))
|
||||
if(LLVM_ROOT)
|
||||
message(FATAL_ERROR "Found LLVM ${LLVM_PACKAGE_VERSION} at LLVM_ROOT, but required ${REQUIRED_LLVM_VERSION}.")
|
||||
else()
|
||||
set(LLVM_FOUND FALSE)
|
||||
set(Clang_FOUND FALSE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT (LLVM_FOUND AND Clang_FOUND))
|
||||
include(FetchContent)
|
||||
|
||||
FetchContent_Declare(
|
||||
llvm_project
|
||||
GIT_REPOSITORY https://github.com/llvm/llvm-project.git
|
||||
GIT_TAG ${LLVM_TAG}
|
||||
SOURCE_SUBDIR llvm
|
||||
)
|
||||
|
||||
set(LLVM_ENABLE_PROJECTS "clang;clang-tools-extra" CACHE STRING "" FORCE)
|
||||
FetchContent_MakeAvailable(llvm_project)
|
||||
endif()
|
||||
|
||||
add_executable(errorck "${CMAKE_CURRENT_LIST_DIR}/main.cpp")
|
||||
target_compile_options(errorck PRIVATE
|
||||
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
|
||||
-Wall -Wextra>
|
||||
$<$<CXX_COMPILER_ID:MSVC>:
|
||||
/W4>)
|
||||
target_include_directories(errorck PRIVATE ${LLVM_INCLUDE_DIRS})
|
||||
target_compile_definitions(errorck PRIVATE ${LLVM_DEFINITIONS})
|
||||
if(DEFINED CLANG_INCLUDE_DIRS)
|
||||
target_include_directories(errorck PRIVATE ${CLANG_INCLUDE_DIRS})
|
||||
endif()
|
||||
if(NOT (LLVM_FOUND AND Clang_FOUND))
|
||||
target_include_directories(errorck PRIVATE
|
||||
${LLVM_SOURCE_DIR}/include
|
||||
${LLVM_BINARY_DIR}/include
|
||||
${LLVM_EXTERNAL_CLANG_SOURCE_DIR}/include
|
||||
${LLVM_BINARY_DIR}/tools/clang/include
|
||||
)
|
||||
endif()
|
||||
|
||||
if(TARGET clang-cpp)
|
||||
target_link_libraries(errorck PRIVATE clang-cpp)
|
||||
else()
|
||||
target_link_libraries(errorck PRIVATE
|
||||
clangTooling
|
||||
clangFrontend
|
||||
clangSerialization
|
||||
clangDriver
|
||||
clangParse
|
||||
clangSema
|
||||
clangAnalysis
|
||||
clangRewrite
|
||||
clangAST
|
||||
clangASTMatchers
|
||||
clangEdit
|
||||
clangLex
|
||||
clangBasic
|
||||
)
|
||||
endif()
|
||||
10
LICENSE
Normal file
10
LICENSE
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
118
README.md
Normal file
118
README.md
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
`errorck` is a Clang libTooling–based static analysis tool for measuring how
|
||||
often error-returning functions are ignored, partially handled, or handled
|
||||
with future-proof catch-all logic in real-world C and C++ codebases.
|
||||
|
||||
It is intended for large-scale, empirical analysis across many projects,
|
||||
not as an interactive linter.
|
||||
|
||||
## Overview
|
||||
|
||||
`errorck` analyzes calls to a fixed set of error-returning functions
|
||||
(hardcoded in the source for now) and classifies how each call’s return
|
||||
value is handled. It also detects simple one-layer wrapper functions that
|
||||
forward error codes (e.g. project-specific allocation wrappers) and treats
|
||||
calls through those wrappers equivalently.
|
||||
|
||||
The tool emits machine-readable output suitable for ingestion into a
|
||||
database and later statistical analysis.
|
||||
|
||||
## What `errorck` detects
|
||||
|
||||
For each call to a watched function (or trivial wrapper), `errorck` classifies
|
||||
the handling into one of the following categories:
|
||||
|
||||
ignored
|
||||
The return value is discarded and not read.
|
||||
|
||||
assigned_not_read
|
||||
The return value is assigned to a local variable but never read,
|
||||
branched on, or returned.
|
||||
|
||||
branched_no_catchall
|
||||
The return value is used in an if or switch, but there is no
|
||||
else/default branch to handle future error cases.
|
||||
|
||||
branched_with_catchall
|
||||
The return value is branched on and includes an else or default.
|
||||
|
||||
propagated
|
||||
The return value is returned directly to the caller.
|
||||
|
||||
used_other
|
||||
The return value is used in some other way (logging, passed to
|
||||
another function, etc.).
|
||||
|
||||
For reporting purposes, the following are considered “ignored” error
|
||||
conditions:
|
||||
|
||||
- ignored
|
||||
- assigned_not_read
|
||||
- branched_no_catchall
|
||||
|
||||
## Trivial wrapper detection
|
||||
|
||||
`errorck` detects one layer of trivial wrappers around watched functions.
|
||||
A function is considered a trivial wrapper if it:
|
||||
|
||||
- returns a watched function call directly, or
|
||||
- assigns the result of a watched function call to a local variable,
|
||||
optionally branches or logs based on that value, and then returns the
|
||||
value unchanged.
|
||||
|
||||
Wrappers are reported explicitly, and calls through wrappers are attributed
|
||||
to the underlying base function.
|
||||
|
||||
## Limitations
|
||||
|
||||
`errorck` deliberately trades completeness for scalability and clarity.
|
||||
|
||||
Current limitations include:
|
||||
|
||||
- One-layer wrapper detection only
|
||||
- No interprocedural dataflow
|
||||
- No function pointer resolution
|
||||
- Simplified wrapper body patterns (single return, single result variable)
|
||||
- Catch-all detection limited to else/default
|
||||
- Analysis is per-translation-unit
|
||||
|
||||
These limitations are documented and must be considered when interpreting
|
||||
results.
|
||||
|
||||
## Building
|
||||
|
||||
`errorck` requires LLVM/Clang with libTooling.
|
||||
|
||||
A minimal build using llvm-config:
|
||||
|
||||
$ c++ -std=c++17 `errorck`.cpp -o `errorck` \
|
||||
`llvm-config --cxxflags --ldflags --system-libs \
|
||||
--libs core clangTooling clangFrontend clangAST clangBasic`
|
||||
|
||||
Alternatively, a CMake build can be used.
|
||||
|
||||
## Running
|
||||
|
||||
`errorck` requires a compilation database.
|
||||
|
||||
$ `errorck` -p /path/to/build file1.c file2.cpp ...
|
||||
|
||||
Output is written to stdout as JSON Lines (one record per line).
|
||||
|
||||
Example:
|
||||
|
||||
$ `errorck` -p . src/*.c > results.jsonl
|
||||
|
||||
## Intended use
|
||||
|
||||
`errorck` is designed for:
|
||||
|
||||
- empirical studies of error handling
|
||||
- large-scale analysis across many repositories
|
||||
- research and auditing, not enforcement
|
||||
|
||||
It is not intended to replace compiler warnings or linters.
|
||||
|
||||
## License
|
||||
|
||||
Public domain, Unlicense, 0BSD, or CC0. Whichever you prefer. The 0BSD license
|
||||
is included in the source distribution.
|
||||
19
main.cpp
Normal file
19
main.cpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#include <cstdlib>
|
||||
|
||||
#include "clang/Tooling/CommonOptionsParser.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
|
||||
using namespace clang::tooling;
|
||||
using namespace llvm;
|
||||
|
||||
static cl::OptionCategory Category("errorck options");
|
||||
|
||||
int main(int argc, const char **argv) {
|
||||
auto pRes = CommonOptionsParser::create(argc, argv, Category);
|
||||
if (!pRes) {
|
||||
llvm::errs() << pRes.takeError();
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
CommonOptionsParser &OptionsParser = pRes.get();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue