binpac: Fix a large number of clang-tidy warnings

This commit is contained in:
Tim Wojtulewicz 2025-08-21 15:05:42 +00:00
parent 4dc546f8c8
commit 31b65f70da
48 changed files with 231 additions and 193 deletions

View file

@ -21,6 +21,7 @@ if (BUILD_STATIC_BINPAC)
target_compile_options(binpac_static PRIVATE "/J")
endif ()
set(BinPAC_LIBRARY binpac_static CACHE STRING "BinPAC library" FORCE)
zeek_target_add_linters(binpac_static)
else ()
add_library(binpac_lib SHARED)
target_sources(binpac_lib PRIVATE ${binpac_lib_SRCS})
@ -31,6 +32,7 @@ else ()
endif ()
install(TARGETS binpac_lib DESTINATION ${CMAKE_INSTALL_LIBDIR})
set(BinPAC_LIBRARY binpac_lib CACHE STRING "BinPAC library" FORCE)
zeek_target_add_linters(binpac_lib)
endif ()
if (ZEEK_ROOT_DIR)

View file

@ -1,8 +1,8 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // for memcpy
#include <cstdio>
#include <cstdlib>
#include <cstring> // for memcpy
#define binpac_regex_h
@ -82,7 +82,7 @@ void FlowBuffer::ResetLineState() {
case CR_OR_LF: state_ = CR_OR_LF_0; break;
case STRICT_CRLF: state_ = STRICT_CRLF_0; break;
case LINE_BREAKER: break; // Nothing to reset
default: BINPAC_ASSERT(0); break;
default: BINPAC_ASSERT(false); break;
}
}
@ -248,7 +248,7 @@ void FlowBuffer::MarkOrCopyLine() {
case CR_OR_LF: MarkOrCopyLine_CR_OR_LF(); break;
case STRICT_CRLF: MarkOrCopyLine_STRICT_CRLF(); break;
case LINE_BREAKER: MarkOrCopyLine_LINEBREAK(); break;
default: BINPAC_ASSERT(0); break;
default: BINPAC_ASSERT(false); break;
}
}

View file

@ -4,11 +4,11 @@
#include "binpac_bytestring.h"
#include <stdlib.h>
#include <cstdlib>
namespace binpac {
std::string std_string(bytestring const* s) { return std::string((const char*)s->begin(), (const char*)s->end()); }
std::string std_string(bytestring const* s) { return {(const char*)s->begin(), (const char*)s->end()}; }
int bytestring_to_int(bytestring const* s) { return atoi((const char*)s->begin()); }

View file

@ -11,6 +11,18 @@ else ()
set_property(SOURCE pac_scan.cc APPEND_STRING PROPERTY COMPILE_FLAGS "-Wno-sign-compare")
endif ()
set(binpac_bison_generated_files
${CMAKE_CURRENT_BINARY_DIR}/pac_parse.cc ${CMAKE_CURRENT_BINARY_DIR}/pac_parse.h
${CMAKE_CURRENT_BINARY_DIR}/pac_scan.cc)
set_source_files_properties(${binpac_bison_generated_files} PROPERTIES SKIP_LINTING ON)
# pac_main.cc includes up pac_parse.h, and so clang-tidy reports a bunch of warnings from
# that header as part of it. adding NOLINTBEGIN/END around the include didn't resolve it.
# I fixed the findings in pac_main.cc, but am ignoring it from here on to avoid the extra
# noise.
set_source_files_properties(pac_main.cc PROPERTIES SKIP_LINTING ON)
set(binpac_SRCS
${BISON_PACParser_INPUT}
${FLEX_PACScanner_INPUT}
@ -55,7 +67,9 @@ set(binpac_SRCS
pac_exception.cc
pac_main.cc)
add_executable(binpac ${binpac_SRCS})
add_executable(binpac)
target_sources(binpac PRIVATE ${binpac_SRCS})
zeek_target_add_linters(binpac)
target_include_directories(binpac BEFORE PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(binpac BEFORE PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

View file

@ -11,7 +11,7 @@
#include "pac_utils.h"
AnalyzerAction::AnalyzerAction(ID* action_id, When when, ActionParam* param, EmbeddedCode* code)
: AnalyzerElement(ACTION), action_id_(action_id), when_(when), param_(param), code_(code), analyzer_(nullptr) {}
: AnalyzerElement(ACTION), action_id_(action_id), when_(when), param_(param), code_(code) {}
AnalyzerAction::~AnalyzerAction() {
delete action_id_;

View file

@ -3,6 +3,8 @@
#ifndef pac_action_h
#define pac_action_h
#include <cstdint>
// Classes representing analyzer actions.
#include "pac_analyzer.h"
@ -10,7 +12,7 @@
class AnalyzerAction : public AnalyzerElement {
public:
enum When { BEFORE, AFTER };
enum When : uint8_t { BEFORE, AFTER };
AnalyzerAction(ID* action_id, When when, ActionParam* param, EmbeddedCode* code);
@ -35,7 +37,7 @@ private:
When when_;
ActionParam* param_;
EmbeddedCode* code_;
AnalyzerDecl* analyzer_;
AnalyzerDecl* analyzer_ = nullptr;
};
class ActionParam {
@ -56,7 +58,7 @@ private:
class ActionParamType {
public:
ActionParamType(const ID* type_id, const ID* field_id = 0) : type_id_(type_id), field_id_(field_id) {}
ActionParamType(const ID* type_id, const ID* field_id = nullptr) : type_id_(type_id), field_id_(field_id) {}
const ID* type_id() const { return type_id_; }
const ID* field_id() const { return field_id_; }

View file

@ -3,6 +3,8 @@
#ifndef pac_analyzer_h
#define pac_analyzer_h
#include <cstdint>
#include "pac_common.h"
#include "pac_field.h"
#include "pac_typedecl.h"
@ -16,8 +18,8 @@ class AnalyzerDataUnit;
class AnalyzerFunction;
class ConnDecl;
class FlowDecl;
typedef vector<AnalyzerHelper*> AnalyzerHelperList;
typedef vector<Function*> FunctionList;
using AnalyzerHelperList = vector<AnalyzerHelper*>;
using FunctionList = vector<Function*>;
class AnalyzerDecl : public TypeDecl {
public:
@ -84,7 +86,7 @@ protected:
class AnalyzerElement : public Object {
public:
enum ElementType { STATE, ACTION, FUNCTION, HELPER, FLOW, DATAUNIT };
enum ElementType : uint8_t { STATE, ACTION, FUNCTION, HELPER, FLOW, DATAUNIT };
AnalyzerElement(ElementType type) : type_(type) {}
virtual ~AnalyzerElement() {}
@ -109,7 +111,7 @@ private:
// A collection of embedded C++ code
class AnalyzerHelper : public AnalyzerElement {
public:
enum Type {
enum Type : uint8_t {
MEMBER_DECLS,
INIT_CODE,
CLEANUP_CODE,
@ -140,7 +142,7 @@ public:
class AnalyzerFlow : public AnalyzerElement {
public:
enum Direction { UP, DOWN };
enum Direction : uint8_t { UP, DOWN };
AnalyzerFlow(Direction dir, ID* type_id, ExprList* params);
~AnalyzerFlow() override;

View file

@ -3,10 +3,12 @@
#ifndef pac_attr_h
#define pac_attr_h
#include <cstdint>
#include "pac_common.h"
#include "pac_datadep.h"
enum AttrType {
enum AttrType : uint8_t {
ATTR_BYTEORDER,
ATTR_CHECK,
ATTR_CHUNKED,

View file

@ -19,6 +19,7 @@ bool BuiltInType::CompatibleBuiltInTypes(BuiltInType* type1, BuiltInType* type2)
}
static const char* basic_pactype_name[] = {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TYPE_DEF(name, pactype, ctype, size) pactype,
#include "pac_type.def"
#undef TYPE_DEF
@ -40,6 +41,7 @@ int BuiltInType::LookUpByName(const char* name) {
}
static const char* basic_ctype_name[] = {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TYPE_DEF(name, pactype, ctype, size) ctype,
#include "pac_type.def"
#undef TYPE_DEF
@ -52,6 +54,7 @@ string BuiltInType::DataTypeStr() const { return basic_ctype_name[bit_type_]; }
int BuiltInType::StaticSize(Env* /* env */) const {
static const size_t basic_type_size[] = {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TYPE_DEF(name, pactype, ctype, size) size,
#include "pac_type.def"
#undef TYPE_DEF

View file

@ -3,11 +3,14 @@
#ifndef pac_btype_h
#define pac_btype_h
#include <cstdint>
#include "pac_type.h"
class BuiltInType : public Type {
public:
enum BITType {
enum BITType : uint8_t {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TYPE_DEF(name, pactype, ctype, size) name,
#include "pac_type.def"
#undef TYPE_DEF
@ -29,7 +32,7 @@ public:
bool IsPointerType() const override { return false; }
bool ByteOrderSensitive() const override { return StaticSize(0) >= 2; }
bool ByteOrderSensitive() const override { return StaticSize(nullptr) >= 2; }
void GenInitCode(Output* out_cc, Env* env) override;

View file

@ -2,7 +2,7 @@
#include "pac_case.h"
#include <stdint.h>
#include <cstdint>
#include <limits>
#include "pac_btype.h"

View file

@ -49,7 +49,7 @@ protected:
ID* index_var_;
CaseFieldList* cases_;
typedef map<const ID*, CaseField*, ID_ptr_cmp> member_map_t;
using member_map_t = map<const ID*, CaseField*, ID_ptr_cmp>;
member_map_t member_map_;
};

View file

@ -3,9 +3,9 @@
#ifndef pac_common_h
#define pac_common_h
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <vector>
#include "pac_utils.h"
@ -87,26 +87,28 @@ class WithInputField;
// The ID of the current declaration.
extern const ID* current_decl_id;
typedef vector<ActionParam*> ActionParamList;
typedef vector<AnalyzerAction*> AnalyzerActionList;
typedef vector<AnalyzerElement*> AnalyzerElementList;
typedef vector<Attr*> AttrList;
typedef vector<CaseExpr*> CaseExprList;
typedef vector<CaseField*> CaseFieldList;
typedef vector<ContextField*> ContextFieldList;
typedef vector<Decl*> DeclList;
typedef vector<Enum*> EnumList;
typedef vector<Expr*> ExprList;
typedef vector<Field*> FieldList;
typedef vector<LetField*> LetFieldList;
typedef vector<Number*> NumList;
typedef vector<Param*> ParamList;
typedef vector<RecordField*> RecordFieldList;
typedef vector<StateVar*> StateVarList;
using ActionParamList = vector<ActionParam*>;
using AnalyzerActionList = vector<AnalyzerAction*>;
using AnalyzerElementList = vector<AnalyzerElement*>;
using AttrList = vector<Attr*>;
using CaseExprList = vector<CaseExpr*>;
using CaseFieldList = vector<CaseField*>;
using ContextFieldList = vector<ContextField*>;
using DeclList = vector<Decl*>;
using EnumList = vector<Enum*>;
using ExprList = vector<Expr*>;
using FieldList = vector<Field*>;
using LetFieldList = vector<LetField*>;
using NumList = vector<Number*>;
using ParamList = vector<Param*>;
using RecordFieldList = vector<RecordField*>;
using StateVarList = vector<StateVar*>;
// NOLINTBEGIN(cppcoreguidelines-macro-usage,modernize-loop-convert)
#define foreach(i, ct, pc) \
if ( pc ) \
for ( ct::iterator i = (pc)->begin(); i != (pc)->end(); ++i )
for ( ct::iterator i = (pc)->begin(); (i) != (pc)->end(); ++(i) )
// NOLINTEND(cppcoreguidelines-macro-usage,modernize-loop-convert)
template<typename T>
constexpr void delete_list(T* container) {
@ -117,17 +119,17 @@ constexpr void delete_list(T* container) {
}
// Constants
const char* const kComputeFrameLength = "compute_frame_length";
const char* const kFlowBufferClass = "FlowBuffer";
const char* const kFlowBufferVar = "flow_buffer";
const char* const kFlowEOF = "FlowEOF";
const char* const kFlowGap = "NewGap";
const char* const kInitialBufferLengthFunc = "initial_buffer_length";
const char* const kNeedMoreData = "need_more_data";
const char* const kNewData = "NewData";
const char* const kParseFuncWithBuffer = "ParseBuffer";
const char* const kParseFuncWithoutBuffer = "Parse";
const char* const kRefCountClass = "binpac::RefCount";
const char* const kTypeWithLengthClass = "binpac::TypeWithLength";
constexpr char kComputeFrameLength[] = "compute_frame_length";
constexpr char kFlowBufferClass[] = "FlowBuffer";
constexpr char kFlowBufferVar[] = "flow_buffer";
constexpr char kFlowEOF[] = "FlowEOF";
constexpr char kFlowGap[] = "NewGap";
constexpr char kInitialBufferLengthFunc[] = "initial_buffer_length";
constexpr char kNeedMoreData[] = "need_more_data";
constexpr char kNewData[] = "NewData";
constexpr char kParseFuncWithBuffer[] = "ParseBuffer";
constexpr char kParseFuncWithoutBuffer[] = "Parse";
constexpr char kRefCountClass[] = "binpac::RefCount";
constexpr char kTypeWithLengthClass[] = "binpac::TypeWithLength";
#endif // pac_common_h

View file

@ -26,7 +26,7 @@ ConnDecl::~ConnDecl() {
}
void ConnDecl::AddBaseClass(vector<string>* base_classes) const {
base_classes->push_back("binpac::ConnectionAnalyzer");
base_classes->emplace_back("binpac::ConnectionAnalyzer");
}
void ConnDecl::ProcessFlowElement(AnalyzerFlow* flow_elem) {

View file

@ -77,7 +77,7 @@ int expand_escape(const char*& s) {
} // namespace
ConstString::ConstString(const string& s) : str_(s) {
ConstString::ConstString(string s) : str_(std::move(s)) {
// Copied from scan.l of Zeek
try {
const char* text = str_.c_str();

View file

@ -7,7 +7,7 @@
class ConstString : public Object {
public:
ConstString(const string& s);
ConstString(string s);
// The string in its escaped form, with surrounding '"'s
const string& str() const { return str_; }

View file

@ -6,7 +6,7 @@
#include "pac_id.h"
#include "pac_type.h"
DataDepElement::DataDepElement(DDE_Type type) : dde_type_(type), in_traversal(false) {}
DataDepElement::DataDepElement(DDE_Type type) : dde_type_(type) {}
bool DataDepElement::Traverse(DataDepVisitor* visitor) {
// Avoid infinite loop

View file

@ -3,17 +3,18 @@
#ifndef pac_datadep_h
#define pac_datadep_h
#include <cstdint>
// To provide a way to traverse through the data dependency graph.
// That is, to evaluate X, what must be evaluated.
#include "pac_common.h"
#include "pac_dbg.h"
class DataDepVisitor;
class DataDepElement {
public:
enum DDE_Type {
enum DDE_Type : uint8_t {
ATTR,
CASEEXPR,
EXPR,
@ -38,7 +39,7 @@ public:
protected:
DDE_Type dde_type_;
bool in_traversal;
bool in_traversal = false;
};
class DataDepVisitor {
@ -51,8 +52,6 @@ public:
class RequiresAnalyzerContext : public DataDepVisitor {
public:
RequiresAnalyzerContext() : requires_analyzer_context_(false) {}
// Returns whether to continue traversal
bool PreProcess(DataDepElement* element) override;
bool PostProcess(DataDepElement* element) override;
@ -64,7 +63,7 @@ public:
protected:
void ProcessExpr(Expr* expr);
bool requires_analyzer_context_;
bool requires_analyzer_context_ = false;
};
#endif // pac_datadep_h

View file

@ -17,6 +17,9 @@ public:
DataPtr(DataPtr const& x) { *this = x; }
DataPtr const& operator=(DataPtr const& x) {
if ( this == &x )
return *this;
id_ = x.id();
offset_ = x.offset();
ptr_expr_ = x.ptr_expr();

View file

@ -3,6 +3,8 @@
#ifndef pac_dataunit_h
#define pac_dataunit_h
#include <cstdint>
#include "pac_analyzer.h"
// The type and parameters of input data unit of a flow. For instance, the
@ -10,7 +12,7 @@
class AnalyzerDataUnit : public AnalyzerElement {
public:
enum DataUnitType { DATAGRAM, FLOWUNIT };
enum DataUnitType : uint8_t { DATAGRAM, FLOWUNIT };
AnalyzerDataUnit(DataUnitType type, ID* id, ExprList* type_params, ExprList* context_params);
~AnalyzerDataUnit() override;

View file

@ -8,7 +8,8 @@
extern bool FLAGS_pac_debug;
#define ASSERT(x) assert(x)
constexpr void ASSERT(bool flag) { assert(flag); }
constexpr void ASSERT(int flag) { assert(flag); }
#define DEBUG_MSG(...) \
if ( FLAGS_pac_debug ) \
fprintf(stderr, __VA_ARGS__)

View file

@ -19,15 +19,13 @@
DeclList* Decl::decl_list_ = nullptr;
Decl::DeclMap Decl::decl_map_;
Decl::Decl(ID* id, DeclType decl_type) : id_(id), decl_type_(decl_type), attrlist_(nullptr) {
Decl::Decl(ID* id, DeclType decl_type) : id_(id), decl_type_(decl_type) {
decl_map_[id_] = this;
if ( ! decl_list_ )
decl_list_ = new DeclList();
decl_list_->push_back(this);
DEBUG_MSG("Finished Decl %s\n", id_->Name());
analyzer_context_ = nullptr;
}
Decl::~Decl() {

View file

@ -3,6 +3,8 @@
#ifndef pac_decl_h
#define pac_decl_h
#include <cstdint>
#include "pac_common.h"
#include "pac_id.h"
@ -10,7 +12,7 @@ class Decl : public Object {
public:
// Note: ANALYZER is not for AnalyzerDecl (which is an
// abstract class) , but for AnalyzerContextDecl.
enum DeclType { ENUM, LET, TYPE, FUNC, CONN, FLOW, ANALYZER, HELPER, REGEX };
enum DeclType : uint8_t { ENUM, LET, TYPE, FUNC, CONN, FLOW, ANALYZER, HELPER, REGEX };
Decl(ID* id, DeclType decl_type);
virtual ~Decl();
@ -41,8 +43,8 @@ protected:
ID* id_;
DeclType decl_type_;
AttrList* attrlist_;
AnalyzerContextDecl* analyzer_context_;
AttrList* attrlist_ = nullptr;
AnalyzerContextDecl* analyzer_context_ = nullptr;
public:
static void ProcessDecls(Output* out_h, Output* out_cc);
@ -50,13 +52,13 @@ public:
private:
static DeclList* decl_list_;
typedef map<const ID*, Decl*, ID_ptr_cmp> DeclMap;
using DeclMap = map<const ID*, Decl*, ID_ptr_cmp>;
static DeclMap decl_map_;
};
class HelperDecl : public Decl {
public:
enum HelperType {
enum HelperType : uint8_t {
HEADER,
CODE,
EXTERN,

View file

@ -6,7 +6,7 @@
#include "pac_output.h"
#include "pac_primitive.h"
EmbeddedCodeSegment::EmbeddedCodeSegment(const string& s) : s_(s), primitive_(nullptr) {}
EmbeddedCodeSegment::EmbeddedCodeSegment(string s) : s_(std::move(s)), primitive_(nullptr) {}
EmbeddedCodeSegment::EmbeddedCodeSegment(PacPrimitive* primitive) : s_(""), primitive_(primitive) {}

View file

@ -7,7 +7,7 @@
class EmbeddedCodeSegment {
public:
explicit EmbeddedCodeSegment(const string& s);
explicit EmbeddedCodeSegment(string s);
explicit EmbeddedCodeSegment(PacPrimitive* primitive);
~EmbeddedCodeSegment();
@ -18,7 +18,7 @@ private:
PacPrimitive* primitive_;
};
typedef vector<EmbeddedCodeSegment*> EmbeddedCodeSegmentList;
using EmbeddedCodeSegmentList = vector<EmbeddedCodeSegment*>;
class EmbeddedCode : public Object {
public:

View file

@ -7,7 +7,7 @@
class Enum {
public:
Enum(ID* id, Expr* expr = 0);
Enum(ID* id, Expr* expr = nullptr);
~Enum();
void GenHeader(Output* out_h, int* pval);

View file

@ -45,6 +45,7 @@ string EvalExprList(ExprList* exprlist, Output* out, Env* env) {
}
static const char* expr_fmt[] = {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define EXPR_DEF(type, num_op, fmt) fmt,
#include "pac_expr.def"
#undef EXPR_DEF
@ -311,11 +312,11 @@ void Expr::GenEval(Output* out_cc, Env* env) {
Type* ty;
try {
if ( (rf = GetRecordField(id, env)) != nullptr ) {
if ( rf = GetRecordField(id, env); rf != nullptr ) {
str_ = strfmt("%s", rf->FieldSize(out_cc, env));
}
} catch ( ExceptionIDNotFound& e ) {
if ( (ty = TypeDecl::LookUpType(id)) != nullptr ) {
if ( ty = TypeDecl::LookUpType(id); ty != nullptr ) {
int ty_size = ty->StaticSize(global_env());
if ( ty_size >= 0 )
str_ = strfmt("%d", ty_size);
@ -339,9 +340,9 @@ void Expr::GenEval(Output* out_cc, Env* env) {
default:
// Evaluate every operand by default
for ( int i = 0; i < 3; ++i )
if ( operand_[i] )
operand_[i]->GenEval(out_cc, env);
for ( auto& op : operand_ )
if ( op )
op->GenEval(out_cc, env);
GenStrFromFormat(env);
break;
}
@ -373,9 +374,9 @@ void Expr::ForceIDEval(Output* out_cc, Env* env) {
default:
// Evaluate every operand by default
for ( int i = 0; i < 3; ++i )
if ( operand_[i] )
operand_[i]->ForceIDEval(out_cc, env);
for ( auto& op : operand_ )
if ( op )
op->ForceIDEval(out_cc, env);
break;
}
}
@ -670,14 +671,14 @@ int Expr::MinimalHeaderSize(Env* env) {
RecordField* rf;
Type* ty;
if ( (rf = GetRecordField(id, env)) != nullptr ) {
if ( rf = GetRecordField(id, env); rf != nullptr ) {
if ( rf->StaticSize(env, -1) >= 0 )
mhs = 0;
else
mhs = mhs_recordfield(env, rf);
}
else if ( (ty = TypeDecl::LookUpType(id)) != nullptr ) {
else if ( ty = TypeDecl::LookUpType(id); ty != nullptr ) {
mhs = 0;
}
@ -703,25 +704,24 @@ int Expr::MinimalHeaderSize(Env* env) {
case EXPR_CALLARGS: {
mhs = 0;
if ( args_ )
for ( unsigned int i = 0; i < args_->size(); ++i )
mhs = mhs_max(mhs, (*args_)[i]->MinimalHeaderSize(env));
for ( const auto& arg : *args_ )
mhs = mhs_max(mhs, arg->MinimalHeaderSize(env));
} break;
case EXPR_CASE: {
mhs = operand_[0]->MinimalHeaderSize(env);
for ( unsigned int i = 0; i < cases_->size(); ++i ) {
CaseExpr* ce = (*cases_)[i];
for ( const auto& ce : *cases_ ) {
if ( ce->index() )
for ( unsigned int j = 0; j < ce->index()->size(); ++j )
mhs = mhs_max(mhs, (*ce->index())[j]->MinimalHeaderSize(env));
for ( const auto& idx : *(ce->index()) )
mhs = mhs_max(mhs, idx->MinimalHeaderSize(env));
mhs = mhs_max(mhs, ce->value()->MinimalHeaderSize(env));
}
} break;
default:
// Evaluate every operand by default
mhs = 0;
for ( int i = 0; i < 3; ++i )
if ( operand_[i] )
mhs = mhs_max(mhs, operand_[i]->MinimalHeaderSize(env));
for ( auto& op : operand_ )
if ( op )
mhs = mhs_max(mhs, op->MinimalHeaderSize(env));
break;
}
@ -750,8 +750,8 @@ bool Expr::HasReference(const ID* id) const {
default:
// Evaluate every operand by default
for ( int i = 0; i < 3; ++i ) {
if ( operand_[i] && operand_[i]->HasReference(id) ) {
for ( auto& op : operand_ ) {
if ( op && op->HasReference(id) ) {
return true;
}
}
@ -788,8 +788,8 @@ bool Expr::DoTraverse(DataDepVisitor* visitor) {
default:
// Evaluate every operand by default
for ( int i = 0; i < 3; ++i ) {
if ( operand_[i] && ! operand_[i]->Traverse(visitor) ) {
for ( auto& op : operand_ ) {
if ( op && ! op->Traverse(visitor) ) {
return false;
}
}
@ -828,9 +828,9 @@ bool Expr::RequiresAnalyzerContext() const {
default:
// Evaluate every operand by default
for ( int i = 0; i < 3; ++i )
if ( operand_[i] && operand_[i]->RequiresAnalyzerContext() ) {
DEBUG_MSG("'%s' requires analyzer context\n", operand_[i]->orig());
for ( auto& op : operand_ )
if ( op && op->RequiresAnalyzerContext() ) {
DEBUG_MSG("'%s' requires analyzer context\n", op->orig());
return true;
}
return false;

View file

@ -13,6 +13,7 @@ class CaseExpr;
class Expr : public Object, public DataDepElement {
public:
enum ExprType : uint8_t {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define EXPR_DEF(type, x, y) type,
#include "pac_expr.def"
#undef EXPR_DEF

View file

@ -3,6 +3,8 @@
#ifndef pac_exttype_h
#define pac_exttype_h
#include <cstdint>
#include "pac_type.h"
// ExternType represent external C++ types that are not defined in
@ -12,7 +14,7 @@
class ExternType : public Type {
public:
enum EXTType { PLAIN, NUMBER, POINTER, BOOLEAN };
enum EXTType : uint8_t { PLAIN, NUMBER, POINTER, BOOLEAN };
ExternType(const ID* id, EXTType ext_type) : Type(EXTERN), id_(id), ext_type_(ext_type) {}
bool DefineValueVar() const override;

View file

@ -3,12 +3,14 @@
#ifndef pac_field_h
#define pac_field_h
#include <cstdint>
#include "pac_common.h"
#include "pac_datadep.h"
// A "field" is a member of class.
enum FieldType {
enum FieldType : uint8_t {
CASE_FIELD,
CONTEXT_FIELD,
FLOW_FIELD,

View file

@ -38,7 +38,7 @@ ParameterizedType* FlowDecl::flow_buffer_type() {
return flow_buffer_type_;
}
void FlowDecl::AddBaseClass(vector<string>* base_classes) const { base_classes->push_back("binpac::FlowAnalyzer"); }
void FlowDecl::AddBaseClass(vector<string>* base_classes) const { base_classes->emplace_back("binpac::FlowAnalyzer"); }
void FlowDecl::ProcessFlowElement(AnalyzerFlow* flow_elem) {
throw Exception(flow_elem, "flow should be defined in only a connection declaration");

View file

@ -8,11 +8,7 @@
#include "pac_param.h"
#include "pac_type.h"
Function::Function(ID* id, Type* type, ParamList* params)
: id_(id), type_(type), params_(params), expr_(nullptr), code_(nullptr) {
analyzer_decl_ = nullptr;
env_ = nullptr;
}
Function::Function(ID* id, Type* type, ParamList* params) : id_(id), type_(type), params_(params) {}
Function::~Function() {
delete id_;

View file

@ -27,16 +27,16 @@ public:
void GenCode(Output* out_h, Output* out_cc);
private:
Env* env_;
Env* env_ = nullptr;
ID* id_;
Type* type_;
ParamList* params_;
AnalyzerDecl* analyzer_decl_;
AnalyzerDecl* analyzer_decl_ = nullptr;
Expr* expr_;
EmbeddedCode* code_;
Expr* expr_ = nullptr;
EmbeddedCode* code_ = nullptr;
};
class FuncDecl : public Decl {

View file

@ -168,9 +168,9 @@ Env::Env(Env* parent_env, Object* context_object) : parent(parent_env), context_
}
Env::~Env() {
for ( id_map_t::iterator it = id_map.begin(); it != id_map.end(); ++it ) {
delete it->second;
it->second = 0;
for ( auto& id : id_map ) {
delete id.second;
id.second = nullptr;
}
}

View file

@ -3,6 +3,7 @@
#ifndef pac_id_h
#define pac_id_h
#include <cstdint>
#include <map>
#include <string>
using namespace std;
@ -24,7 +25,7 @@ using namespace std;
// Env -- a mapping from ID names to their L/R-value expressions and evaluation
// methods.
enum IDType {
enum IDType : uint8_t {
CONST,
GLOBAL_VAR,
TEMP_VAR,
@ -44,7 +45,7 @@ class Evaluatable;
class ID : public Object {
public:
ID(string arg_name) : name(arg_name), anonymous_id_(false) { locname = nfmt("%s:%s", Location(), Name()); }
ID(string arg_name) : name(std::move(arg_name)) { locname = nfmt("%s:%s", Location(), Name()); }
~ID() { delete[] locname; }
bool operator==(ID const& x) const { return name == x.Name(); }
@ -57,8 +58,8 @@ public:
protected:
string name;
bool anonymous_id_;
char* locname;
bool anonymous_id_ = false;
char* locname = nullptr;
friend class ID_ptr_cmp;
public:
@ -146,7 +147,7 @@ public:
void set_in_branch(bool x) { in_branch_ = x; }
void AddID(const ID* id, IDType id_type, Type* type);
void AddConstID(const ID* id, const int c, Type* type = 0);
void AddConstID(const ID* id, const int c, Type* type = nullptr);
void AddMacro(const ID* id, Expr* expr);
// Generate a temp ID with a unique name
@ -192,7 +193,7 @@ protected:
private:
Env* parent;
Object* context_object_;
typedef map<const ID*, IDRecord*, ID_ptr_cmp> id_map_t;
using id_map_t = map<const ID*, IDRecord*, ID_ptr_cmp>;
id_map_t id_map;
bool allow_undefined_id_;
bool in_branch_;

View file

@ -31,5 +31,5 @@ DataPtr InputBuffer::GenDataBeginEnd(Output* out_cc, Env* env) {
env->SetEvaluated(begin_of_data);
env->SetEvaluated(end_of_data);
return DataPtr(env, begin_of_data, 0);
return {env, begin_of_data, 0};
}

View file

@ -1,7 +1,7 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include <ctype.h>
#include <unistd.h>
#include <cctype>
#include "pac_common.h"
#include "pac_decl.h"
@ -9,7 +9,9 @@
#include "pac_exttype.h"
#include "pac_id.h"
#include "pac_output.h"
// NOLINTBEGIN
#include "pac_parse.h"
// NOLINTEND
#include "pac_type.h"
#include "pac_utils.h"
@ -27,7 +29,8 @@ Output* header_output = nullptr;
Output* source_output = nullptr;
void add_to_include_directories(string dirs) {
unsigned int dir_begin = 0, dir_end;
unsigned int dir_begin = 0;
unsigned int dir_end = 0;
while ( dir_begin < dirs.length() ) {
for ( dir_end = dir_begin; dir_end < dirs.length(); ++dir_end )
if ( dirs[dir_end] == ':' )

View file

@ -2,10 +2,10 @@
#include "pac_output.h"
#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <cerrno>
#include <cstdarg>
#include <cstdio>
#include <cstring>
#include "pac_utils.h"

View file

@ -262,15 +262,15 @@ decl_with_attr : TOK_TYPE tok_id { current_decl_id = $2; } optparams '=' type
decl_without_attr: TOK_LPB_HEADER embedded_code TOK_RPB
{
$$ = new HelperDecl(HelperDecl::HEADER, 0, $2);
$$ = new HelperDecl(HelperDecl::HEADER, nullptr, $2);
}
| TOK_LPB_CODE embedded_code TOK_RPB
{
$$ = new HelperDecl(HelperDecl::CODE, 0, $2);
$$ = new HelperDecl(HelperDecl::CODE, nullptr, $2);
}
| TOK_LPB_EXTERN embedded_code TOK_RPB
{
$$ = new HelperDecl(HelperDecl::EXTERN, 0, $2);
$$ = new HelperDecl(HelperDecl::EXTERN, nullptr, $2);
}
| TOK_REFINE TOK_TYPEATTR tok_id TOK_PLUSEQ attrlist
{
@ -359,7 +359,7 @@ optparams : '(' paramlist ')'
}
| /* empty */
{
$$ = 0;
$$ = nullptr;
}
;
@ -387,7 +387,7 @@ param : tok_id ':' type2
optinit : /* nothing */
{
$$ = 0;
$$ = nullptr;
}
| '=' expr
{
@ -397,7 +397,7 @@ optinit : /* nothing */
opttype : /* nothing */
{
$$ = 0;
$$ = nullptr;
}
| ':' type2
{
@ -545,13 +545,13 @@ casefield0 : exprlist TOK_RIGHTARROW tok_id ':' type2
}
| TOK_DEFAULT TOK_RIGHTARROW tok_id ':' type2
{
$$ = new CaseField(0, $3, $5);
$$ = new CaseField(nullptr, $3, $5);
}
;
optexprlist : /* nothing */
{
$$ = 0;
$$ = nullptr;
}
| exprlist
{
@ -740,7 +740,7 @@ caseexpr : exprlist TOK_RIGHTARROW expr
}
| TOK_DEFAULT TOK_RIGHTARROW expr
{
$$ = new CaseExpr(0, $3);
$$ = new CaseExpr(nullptr, $3);
}
;
@ -916,7 +916,7 @@ embedded_pac_primitive: TOK_PAC_VAL expr TOK_END_PAC
optargs : /* empty */
{
$$ = 0;
$$ = nullptr;
}
| '(' optexprlist ')'
{
@ -963,7 +963,7 @@ input : expr
optattrs : /* empty */
{
$$ = 0;
$$ = nullptr;
}
| attrlist
{
@ -1061,7 +1061,7 @@ attr : TOK_ATTR_BYTEORDER '=' expr
optlinebreaker : /* nothing */
{
$$ = 0;
$$ = nullptr;
}
| '(' expr ')'
{
@ -1071,7 +1071,7 @@ optlinebreaker : /* nothing */
%%
const ID* current_decl_id = 0;
const ID* current_decl_id = nullptr;
int yyerror(const char msg[]) {
auto n = strlen(msg) + yyleng + 64;

View file

@ -9,7 +9,7 @@
string PPVal::ToCode(Env* env) {
ASSERT(expr_);
return string(expr_->EvalExpr(nullptr, env));
return {expr_->EvalExpr(nullptr, env)};
}
string PPSet::ToCode(Env* env) {

View file

@ -3,11 +3,13 @@
#ifndef pac_primitive_h
#define pac_primitive_h
#include <cstdint>
#include "pac_common.h"
class PacPrimitive {
public:
enum PrimitiveType { VAL, SET, TYPE, CONST_DEF };
enum PrimitiveType : uint8_t { VAL, SET, TYPE, CONST_DEF };
explicit PacPrimitive(PrimitiveType type) : type_(type) {}
virtual ~PacPrimitive() {}

View file

@ -135,7 +135,7 @@ protected:
bool DoTraverse(DataDepVisitor* visitor) override;
};
enum PaddingType { PAD_BY_LENGTH, PAD_TO_OFFSET, PAD_TO_NEXT_WORD };
enum PaddingType : uint8_t { PAD_BY_LENGTH, PAD_TO_OFFSET, PAD_TO_NEXT_WORD };
class RecordPaddingField : public RecordField {
public:

View file

@ -273,11 +273,7 @@ void StringType::GenDynamicSizeRegEx(Output* out_cc, Env* env, const DataPtr& da
void StringType::GenDynamicSizeAnyStr(Output* out_cc, Env* env, const DataPtr& data) {
ASSERT(type_ == ANYSTR);
if ( attr_restofdata_ || attr_oneline_ ) {
out_cc->println("%s = (%s) - (%s);", env->LValue(string_length_var()), env->RValue(end_of_data),
data.ptr_expr());
}
else if ( attr_restofflow_ ) {
if ( attr_restofdata_ || attr_oneline_ || attr_restofflow_ ) {
out_cc->println("%s = (%s) - (%s);", env->LValue(string_length_var()), env->RValue(end_of_data),
data.ptr_expr());
}

View file

@ -3,12 +3,14 @@
#ifndef pac_strtype_h
#define pac_strtype_h
#include <cstdint>
#include "pac_type.h"
// TODO: question: shall we merge it with ArrayType?
class StringType : public Type {
public:
enum StringTypeEnum { CSTR, REGEX, ANYSTR };
enum StringTypeEnum : uint8_t { CSTR, REGEX, ANYSTR };
explicit StringType(StringTypeEnum anystr);
explicit StringType(ConstString* str);

View file

@ -696,7 +696,7 @@ string Type::DataSize(Output* out_cc, Env* env, const DataPtr& data) {
}
else {
if ( ! size_var() || ! env->Evaluated(size_var()) ) {
ASSERT(out_cc != 0);
ASSERT(out_cc != nullptr);
GenDynamicSize(out_cc, env, data);
ASSERT(size_var());
}

View file

@ -303,7 +303,7 @@ public:
static Type* LookUpByID(ID* id);
protected:
typedef map<string, Type*> type_map_t;
using type_map_t = map<string, Type*>;
static type_map_t type_map_;
};

View file

@ -101,7 +101,7 @@ void TypeDecl::GenCode(Output* out_h, Output* out_cc) {
AddBaseClass(&base_classes);
if ( type_->attr_refcount() )
base_classes.push_back(kRefCountClass);
base_classes.emplace_back(kRefCountClass);
// The first line of class definition
out_h->println("");
@ -232,7 +232,8 @@ string TypeDecl::ParseFuncPrototype(Env* env) {
}
void TypeDecl::GenParsingEnd(Output* out_cc, Env* env, const DataPtr& data) {
string ret_val_0, ret_val_1;
string ret_val_0;
string ret_val_1;
if ( type_->incremental_input() ) {
ret_val_0 = type_->parsing_complete(env).c_str();
@ -259,9 +260,6 @@ void TypeDecl::GenParsingEnd(Output* out_cc, Env* env, const DataPtr& data) {
out_cc->println("BINPAC_ASSERT(!(%s));", type_->parsing_complete(env).c_str());
out_cc->println("return %s;", ret_val_1.c_str());
}
else if ( type_->incremental_input() ) {
out_cc->println("return %s;", ret_val_0.c_str());
}
else {
out_cc->println("return %s;", ret_val_0.c_str());
}

View file

@ -2,9 +2,9 @@
#include "pac_utils.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <cstdarg>
#include <cstdio>
#include <cstring>
char* copy_string(const char* s) {
char* c = new char[strlen(s) + 1];
@ -27,7 +27,7 @@ string strfmt(const char* format, ...) {
va_start(ap, format);
const char* r = do_fmt(format, ap);
va_end(ap);
return string(r);
return {r};
}
char* nfmt(const char* format, ...) {