diff --git a/src/Attribute.cpp b/src/Attribute.cpp new file mode 100644 index 000000000..949e3d067 --- /dev/null +++ b/src/Attribute.cpp @@ -0,0 +1,65 @@ +#if HAVE_CONFIG_H +# include +#endif + +#ifdef WIN32 +#pragma warning(disable : 4786) /* Disable annoying warning messages */ +#endif + +#include "random.h" +#include "OutputMgr.h" +#include "Attribute.h" + +void +AttributeGenerator::Output(std::ostream &out) +{ + bool attr_emitted = false; + vector::iterator itr; + for(itr = attributes.begin(); itr != attributes.end(); itr++){ + string attr_generated; + attr_generated = (*itr)->make_random(); + if(attr_generated != ""){ + if(!attr_emitted){ + out << " __attribute__((" << attr_generated; + attr_emitted = true; + } + else + out << ", " << attr_generated; + } + } + if(attr_emitted) + out << "))"; +} + +Attribute::Attribute(string name, int prob) + : name(name), prob(prob) +{ +} + +BooleanAttribute::BooleanAttribute(string name, int prob) + : Attribute(name, prob) +{ +} + +string +BooleanAttribute::make_random() +{ + if(rnd_flipcoin(prob)) + return name; + else + return ""; +} + +MultiChoiceAttribute::MultiChoiceAttribute(string name, int prob, vector arguments) + : Attribute(name, prob), choices(arguments) +{ +} + +string +MultiChoiceAttribute::make_random() +{ + if(rnd_flipcoin(prob)) + return name + "(\"" + choices[rnd_upto(choices.size())] + "\")"; + else + return ""; +} diff --git a/src/Attribute.h b/src/Attribute.h new file mode 100644 index 000000000..af80da236 --- /dev/null +++ b/src/Attribute.h @@ -0,0 +1,49 @@ +#ifndef ATTRIBUTE_H +#define ATTRIBUTE_H + +#include +#include +using namespace std; + +class AttributeGenerator; + +//Base class with pure virtual methods which will be derived as per different types of attribute generation +class Attribute +{ +public: + //Name of attribute + string name; + //Attribute generation probability + int prob; + Attribute(string, int); + //Checks attribute probability and generate is accordingly + virtual string make_random() = 0; +}; + +//Generates Boolean attributes such as hot, cold, used, unused, deprecated, etc +class BooleanAttribute : public Attribute +{ +public: + BooleanAttribute(string, int); + string make_random(); +}; + +//Generates Multi Choice attributes such as visibility("option"), no_sanitize("option"), etc +class MultiChoiceAttribute : public Attribute +{ +public: + //stores various options of attributes e.g. visibility options - default, hidden, internal and protected + vector choices; + MultiChoiceAttribute(string, int, vector); + string make_random(); +}; + +class AttributeGenerator +{ +public: + //stores instances of Attribute + vector attributes; + void Output(std::ostream &); +}; + +#endif diff --git a/src/CGOptions.cpp b/src/CGOptions.cpp index af3d904f1..5cb459b56 100644 --- a/src/CGOptions.cpp +++ b/src/CGOptions.cpp @@ -195,6 +195,9 @@ DEFINE_GETTER_SETTER_BOOL(lang_cpp); DEFINE_GETTER_SETTER_BOOL(cpp11); DEFINE_GETTER_SETTER_BOOL(fast_execution); +//GCC C Extensions +DEFINE_GETTER_SETTER_BOOL(func_attr_flag); + void CGOptions::set_default_builtin_kinds() { diff --git a/src/CGOptions.h b/src/CGOptions.h index ab7c417d5..43465d55b 100644 --- a/src/CGOptions.h +++ b/src/CGOptions.h @@ -457,6 +457,9 @@ class CGOptions { static bool fast_execution(void); static bool fast_execution(bool p); + //GCC C Extensions + static bool func_attr_flag(void); + static bool func_attr_flag(bool p); private: static bool enabled_builtin_kind(const string &kind); @@ -598,6 +601,9 @@ class CGOptions { // flag to indicate language static bool lang_cpp_; static bool cpp11_; + + //GCC C Extensions + static bool func_attr_flag_; private: CGOptions(void); CGOptions(CGOptions &cgo); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ffe7cfd2a..b410994df 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -53,6 +53,8 @@ set(csmith_SOURCES AbsRndNumGenerator.h ArrayVariable.cpp ArrayVariable.h + Attribute.cpp + Attribute.h Block.cpp Block.h Bookkeeper.cpp diff --git a/src/Function.cpp b/src/Function.cpp index a48c22935..f92b7a887 100644 --- a/src/Function.cpp +++ b/src/Function.cpp @@ -66,17 +66,78 @@ #include "DepthSpec.h" #include "ExtensionMgr.h" #include "OutputMgr.h" +#include "Attribute.h" using namespace std; /////////////////////////////////////////////////////////////////////////////// +AttributeGenerator func_attr_generator; static vector FuncList; // List of all functions in the program static vector FMList; // list of fact managers for each function static long cur_func_idx; // Index into FuncList that we are currently working on static bool param_first=true; // Flag to track output of commas static int builtin_functions_cnt; +static std::vector common_func_attributes; +static std::vector visibility_choices; +static std::vector sanitize_choices; + +void +InitializeAttributesChoices() +{ + //Pushing common function attributes + common_func_attributes.push_back("artificial"); + common_func_attributes.push_back("flatten"); + common_func_attributes.push_back("no_reorder"); + common_func_attributes.push_back("hot"); + common_func_attributes.push_back("cold"); + common_func_attributes.push_back("noipa"); + common_func_attributes.push_back("used"); + common_func_attributes.push_back("unused"); + common_func_attributes.push_back("nothrow"); + common_func_attributes.push_back("deprecated"); + common_func_attributes.push_back("no_icf"); + common_func_attributes.push_back("no_profile_instrument_function"); + common_func_attributes.push_back("no_instrument_function"); + common_func_attributes.push_back("no_sanitize_address"); + common_func_attributes.push_back("no_sanitize_thread"); + common_func_attributes.push_back("no_sanitize_undefined"); + common_func_attributes.push_back("no_split_stack"); + common_func_attributes.push_back("noinline"); + common_func_attributes.push_back("noplt"); + common_func_attributes.push_back("stack_protect"); + + //Pushing visibility choices + visibility_choices.push_back("default"); + visibility_choices.push_back("hidden"); + visibility_choices.push_back("protected"); + visibility_choices.push_back("internal"); + + //Pushing sanitize choices + sanitize_choices.push_back("address"); + sanitize_choices.push_back("thread"); + sanitize_choices.push_back("undefined"); + sanitize_choices.push_back("kernel-address"); + sanitize_choices.push_back("pointer-compare"); + sanitize_choices.push_back("pointer-subtract"); + sanitize_choices.push_back("leak"); +} + +void +Function::InitializeAttributes() +{ + if(CGOptions::func_attr_flag()){ + InitializeAttributesChoices(); + vector::iterator itr; + for(itr = common_func_attributes.begin(); itr < common_func_attributes.end(); itr++) + func_attr_generator.attributes.push_back(new BooleanAttribute(*itr, FuncAttrProb)); + + func_attr_generator.attributes.push_back(new MultiChoiceAttribute("visibility", FuncAttrProb, visibility_choices)); + func_attr_generator.attributes.push_back(new MultiChoiceAttribute("no_sanitize", FuncAttrProb, sanitize_choices)); + } +} + /* * find FactMgr for a function */ @@ -481,6 +542,8 @@ Function::make_first(void) // collect info about global dangling pointers fm->find_dangling_global_ptrs(f); + + f->InitializeAttributes(); return f; } @@ -552,6 +615,7 @@ Function::OutputForwardDecl(std::ostream &out) if (is_builtin) return; OutputHeader(out); + func_attr_generator.Output(out); out << ";"; outputln(out); } diff --git a/src/Function.h b/src/Function.h index 837820f09..e28c46cf3 100644 --- a/src/Function.h +++ b/src/Function.h @@ -122,7 +122,7 @@ class Function bool is_builtin; int visited_cnt; Effect accum_eff_context; - + void InitializeAttributes(); private: static int deleteFunction(Function* func); diff --git a/src/Makefile.am b/src/Makefile.am index e24c14762..ac2993e7b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -60,6 +60,8 @@ csmith_SOURCES = \ AbsRndNumGenerator.h \ ArrayVariable.cpp \ ArrayVariable.h \ + Attribute.cpp \ + Attribute.h \ Block.cpp \ Block.h \ Bookkeeper.cpp \ diff --git a/src/Makefile.in b/src/Makefile.in index 94af5229f..f175c4561 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -117,22 +117,22 @@ PROGRAMS = $(bin_PROGRAMS) am__csmith_SOURCES_DIST = AbsExtension.cpp AbsExtension.h \ AbsProgramGenerator.cpp AbsProgramGenerator.h \ AbsRndNumGenerator.cpp AbsRndNumGenerator.h ArrayVariable.cpp \ - ArrayVariable.h Block.cpp Block.h Bookkeeper.cpp Bookkeeper.h \ - CFGEdge.cpp CFGEdge.h CGContext.cpp CGContext.h CGOptions.cpp \ - CGOptions.h CVQualifiers.cpp CVQualifiers.h Common.h \ - CommonMacros.h CompatibleChecker.cpp CompatibleChecker.h \ - Constant.cpp Constant.h CoverageTestExtension.cpp \ - CoverageTestExtension.h CrestExtension.cpp CrestExtension.h \ - DFSOutputMgr.cpp DFSOutputMgr.h DFSProgramGenerator.cpp \ - DFSProgramGenerator.h DFSRndNumGenerator.cpp \ - DFSRndNumGenerator.h DefaultOutputMgr.cpp DefaultOutputMgr.h \ + ArrayVariable.h Attribute.cpp Attribute.h Block.cpp Block.h \ + Bookkeeper.cpp Bookkeeper.h CFGEdge.cpp CFGEdge.h \ + CGContext.cpp CGContext.h CGOptions.cpp CGOptions.h \ + CVQualifiers.cpp CVQualifiers.h Common.h CommonMacros.h \ + CompatibleChecker.cpp CompatibleChecker.h Constant.cpp \ + Constant.h CoverageTestExtension.cpp CoverageTestExtension.h \ + CrestExtension.cpp CrestExtension.h DFSOutputMgr.cpp \ + DFSOutputMgr.h DFSProgramGenerator.cpp DFSProgramGenerator.h \ + DFSRndNumGenerator.cpp DFSRndNumGenerator.h \ + DefaultOutputMgr.cpp DefaultOutputMgr.h \ DefaultProgramGenerator.cpp DefaultProgramGenerator.h \ DefaultRndNumGenerator.cpp DefaultRndNumGenerator.h \ - DepthSpec.cpp DepthSpec.h \ - Effect.cpp Effect.h Enumerator.h Error.cpp Error.h \ - Expression.cpp Expression.h ExpressionAssign.cpp \ - ExpressionAssign.h ExpressionComma.cpp ExpressionComma.h \ - ExpressionFuncall.cpp ExpressionFuncall.h \ + DepthSpec.cpp DepthSpec.h Effect.cpp Effect.h Enumerator.h \ + Error.cpp Error.h Expression.cpp Expression.h \ + ExpressionAssign.cpp ExpressionAssign.h ExpressionComma.cpp \ + ExpressionComma.h ExpressionFuncall.cpp ExpressionFuncall.h \ ExpressionVariable.cpp ExpressionVariable.h ExtensionMgr.cpp \ ExtensionMgr.h ExtensionValue.cpp ExtensionValue.h Fact.cpp \ Fact.h FactMgr.cpp FactMgr.h FactPointTo.cpp FactPointTo.h \ @@ -143,13 +143,12 @@ am__csmith_SOURCES_DIST = AbsExtension.cpp AbsExtension.h \ FunctionInvocationUnary.h FunctionInvocationUser.cpp \ FunctionInvocationUser.h KleeExtension.cpp KleeExtension.h \ Lhs.cpp Lhs.h LinearSequence.cpp LinearSequence.h \ - OutputMgr.cpp OutputMgr.h \ - PartialExpander.cpp PartialExpander.h Probabilities.cpp \ - Probabilities.h ProbabilityTable.h RandomNumber.cpp \ - RandomNumber.h RandomProgramGenerator.cpp \ - SafeOpFlags.cpp SafeOpFlags.h Sequence.cpp Sequence.h \ - SequenceFactory.cpp SequenceFactory.h SequenceLineParser.h \ - Statement.cpp Statement.h \ + OutputMgr.cpp OutputMgr.h PartialExpander.cpp \ + PartialExpander.h Probabilities.cpp Probabilities.h \ + ProbabilityTable.h RandomNumber.cpp RandomNumber.h \ + RandomProgramGenerator.cpp SafeOpFlags.cpp SafeOpFlags.h \ + Sequence.cpp Sequence.h SequenceFactory.cpp SequenceFactory.h \ + SequenceLineParser.h Statement.cpp Statement.h \ StatementArrayOp.cpp StatementArrayOp.h StatementAssign.cpp \ StatementAssign.h StatementBreak.cpp StatementBreak.h \ StatementContinue.cpp StatementContinue.h StatementExpr.cpp \ @@ -168,39 +167,38 @@ am__dirstamp = $(am__leading_dot)dirstamp @HAVE_LRAND48_FALSE@ rand48/srand48.$(OBJEXT) am_csmith_OBJECTS = AbsExtension.$(OBJEXT) \ AbsProgramGenerator.$(OBJEXT) AbsRndNumGenerator.$(OBJEXT) \ - ArrayVariable.$(OBJEXT) Block.$(OBJEXT) Bookkeeper.$(OBJEXT) \ - CFGEdge.$(OBJEXT) CGContext.$(OBJEXT) CGOptions.$(OBJEXT) \ - CVQualifiers.$(OBJEXT) CompatibleChecker.$(OBJEXT) \ - Constant.$(OBJEXT) CoverageTestExtension.$(OBJEXT) \ - CrestExtension.$(OBJEXT) DFSOutputMgr.$(OBJEXT) \ - DFSProgramGenerator.$(OBJEXT) DFSRndNumGenerator.$(OBJEXT) \ - DefaultOutputMgr.$(OBJEXT) DefaultProgramGenerator.$(OBJEXT) \ - DefaultRndNumGenerator.$(OBJEXT) \ - DepthSpec.$(OBJEXT) Effect.$(OBJEXT) Error.$(OBJEXT) \ - Expression.$(OBJEXT) ExpressionAssign.$(OBJEXT) \ - ExpressionComma.$(OBJEXT) ExpressionFuncall.$(OBJEXT) \ - ExpressionVariable.$(OBJEXT) ExtensionMgr.$(OBJEXT) \ - ExtensionValue.$(OBJEXT) Fact.$(OBJEXT) FactMgr.$(OBJEXT) \ - FactPointTo.$(OBJEXT) FactUnion.$(OBJEXT) Filter.$(OBJEXT) \ - Finalization.$(OBJEXT) Function.$(OBJEXT) \ + ArrayVariable.$(OBJEXT) Attribute.$(OBJEXT) Block.$(OBJEXT) \ + Bookkeeper.$(OBJEXT) CFGEdge.$(OBJEXT) CGContext.$(OBJEXT) \ + CGOptions.$(OBJEXT) CVQualifiers.$(OBJEXT) \ + CompatibleChecker.$(OBJEXT) Constant.$(OBJEXT) \ + CoverageTestExtension.$(OBJEXT) CrestExtension.$(OBJEXT) \ + DFSOutputMgr.$(OBJEXT) DFSProgramGenerator.$(OBJEXT) \ + DFSRndNumGenerator.$(OBJEXT) DefaultOutputMgr.$(OBJEXT) \ + DefaultProgramGenerator.$(OBJEXT) \ + DefaultRndNumGenerator.$(OBJEXT) DepthSpec.$(OBJEXT) \ + Effect.$(OBJEXT) Error.$(OBJEXT) Expression.$(OBJEXT) \ + ExpressionAssign.$(OBJEXT) ExpressionComma.$(OBJEXT) \ + ExpressionFuncall.$(OBJEXT) ExpressionVariable.$(OBJEXT) \ + ExtensionMgr.$(OBJEXT) ExtensionValue.$(OBJEXT) Fact.$(OBJEXT) \ + FactMgr.$(OBJEXT) FactPointTo.$(OBJEXT) FactUnion.$(OBJEXT) \ + Filter.$(OBJEXT) Finalization.$(OBJEXT) Function.$(OBJEXT) \ FunctionInvocation.$(OBJEXT) \ FunctionInvocationBinary.$(OBJEXT) \ FunctionInvocationUnary.$(OBJEXT) \ FunctionInvocationUser.$(OBJEXT) KleeExtension.$(OBJEXT) \ - Lhs.$(OBJEXT) LinearSequence.$(OBJEXT) \ - OutputMgr.$(OBJEXT) PartialExpander.$(OBJEXT) \ - Probabilities.$(OBJEXT) RandomNumber.$(OBJEXT) \ - RandomProgramGenerator.$(OBJEXT) SafeOpFlags.$(OBJEXT) \ - Sequence.$(OBJEXT) SequenceFactory.$(OBJEXT) \ - Statement.$(OBJEXT) StatementArrayOp.$(OBJEXT) \ - StatementAssign.$(OBJEXT) StatementBreak.$(OBJEXT) \ - StatementContinue.$(OBJEXT) StatementExpr.$(OBJEXT) \ - StatementFor.$(OBJEXT) StatementGoto.$(OBJEXT) \ - StatementIf.$(OBJEXT) StatementReturn.$(OBJEXT) \ - StringUtils.$(OBJEXT) Type.$(OBJEXT) Variable.$(OBJEXT) \ - VariableSelector.$(OBJEXT) VectorFilter.$(OBJEXT) \ - platform.$(OBJEXT) random.$(OBJEXT) util.$(OBJEXT) \ - $(am__objects_1) + Lhs.$(OBJEXT) LinearSequence.$(OBJEXT) OutputMgr.$(OBJEXT) \ + PartialExpander.$(OBJEXT) Probabilities.$(OBJEXT) \ + RandomNumber.$(OBJEXT) RandomProgramGenerator.$(OBJEXT) \ + SafeOpFlags.$(OBJEXT) Sequence.$(OBJEXT) \ + SequenceFactory.$(OBJEXT) Statement.$(OBJEXT) \ + StatementArrayOp.$(OBJEXT) StatementAssign.$(OBJEXT) \ + StatementBreak.$(OBJEXT) StatementContinue.$(OBJEXT) \ + StatementExpr.$(OBJEXT) StatementFor.$(OBJEXT) \ + StatementGoto.$(OBJEXT) StatementIf.$(OBJEXT) \ + StatementReturn.$(OBJEXT) StringUtils.$(OBJEXT) Type.$(OBJEXT) \ + Variable.$(OBJEXT) VariableSelector.$(OBJEXT) \ + VectorFilter.$(OBJEXT) platform.$(OBJEXT) random.$(OBJEXT) \ + util.$(OBJEXT) $(am__objects_1) nodist_csmith_OBJECTS = git_version.$(OBJEXT) csmith_OBJECTS = $(am_csmith_OBJECTS) $(nodist_csmith_OBJECTS) csmith_LDADD = $(LDADD) @@ -226,18 +224,17 @@ am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/AbsExtension.Po \ ./$(DEPDIR)/AbsProgramGenerator.Po \ ./$(DEPDIR)/AbsRndNumGenerator.Po ./$(DEPDIR)/ArrayVariable.Po \ - ./$(DEPDIR)/Block.Po ./$(DEPDIR)/Bookkeeper.Po \ - ./$(DEPDIR)/CFGEdge.Po ./$(DEPDIR)/CGContext.Po \ - ./$(DEPDIR)/CGOptions.Po ./$(DEPDIR)/CVQualifiers.Po \ - ./$(DEPDIR)/CompatibleChecker.Po ./$(DEPDIR)/Constant.Po \ - ./$(DEPDIR)/CoverageTestExtension.Po \ + ./$(DEPDIR)/Attribute.Po ./$(DEPDIR)/Block.Po \ + ./$(DEPDIR)/Bookkeeper.Po ./$(DEPDIR)/CFGEdge.Po \ + ./$(DEPDIR)/CGContext.Po ./$(DEPDIR)/CGOptions.Po \ + ./$(DEPDIR)/CVQualifiers.Po ./$(DEPDIR)/CompatibleChecker.Po \ + ./$(DEPDIR)/Constant.Po ./$(DEPDIR)/CoverageTestExtension.Po \ ./$(DEPDIR)/CrestExtension.Po ./$(DEPDIR)/DFSOutputMgr.Po \ ./$(DEPDIR)/DFSProgramGenerator.Po \ ./$(DEPDIR)/DFSRndNumGenerator.Po \ ./$(DEPDIR)/DefaultOutputMgr.Po \ ./$(DEPDIR)/DefaultProgramGenerator.Po \ - ./$(DEPDIR)/DefaultRndNumGenerator.Po \ - ./$(DEPDIR)/DepthSpec.Po \ + ./$(DEPDIR)/DefaultRndNumGenerator.Po ./$(DEPDIR)/DepthSpec.Po \ ./$(DEPDIR)/Effect.Po ./$(DEPDIR)/Error.Po \ ./$(DEPDIR)/Expression.Po ./$(DEPDIR)/ExpressionAssign.Po \ ./$(DEPDIR)/ExpressionComma.Po \ @@ -252,12 +249,12 @@ am__depfiles_remade = ./$(DEPDIR)/AbsExtension.Po \ ./$(DEPDIR)/FunctionInvocationUnary.Po \ ./$(DEPDIR)/FunctionInvocationUser.Po \ ./$(DEPDIR)/KleeExtension.Po ./$(DEPDIR)/Lhs.Po \ - ./$(DEPDIR)/LinearSequence.Po \ - ./$(DEPDIR)/OutputMgr.Po ./$(DEPDIR)/PartialExpander.Po \ - ./$(DEPDIR)/Probabilities.Po ./$(DEPDIR)/RandomNumber.Po \ - ./$(DEPDIR)/RandomProgramGenerator.Po ./$(DEPDIR)/SafeOpFlags.Po \ - ./$(DEPDIR)/Sequence.Po ./$(DEPDIR)/SequenceFactory.Po \ - ./$(DEPDIR)/Statement.Po \ + ./$(DEPDIR)/LinearSequence.Po ./$(DEPDIR)/OutputMgr.Po \ + ./$(DEPDIR)/PartialExpander.Po ./$(DEPDIR)/Probabilities.Po \ + ./$(DEPDIR)/RandomNumber.Po \ + ./$(DEPDIR)/RandomProgramGenerator.Po \ + ./$(DEPDIR)/SafeOpFlags.Po ./$(DEPDIR)/Sequence.Po \ + ./$(DEPDIR)/SequenceFactory.Po ./$(DEPDIR)/Statement.Po \ ./$(DEPDIR)/StatementArrayOp.Po ./$(DEPDIR)/StatementAssign.Po \ ./$(DEPDIR)/StatementBreak.Po ./$(DEPDIR)/StatementContinue.Po \ ./$(DEPDIR)/StatementExpr.Po ./$(DEPDIR)/StatementFor.Po \ @@ -473,22 +470,22 @@ git_version_edit = sed \ csmith_SOURCES = AbsExtension.cpp AbsExtension.h \ AbsProgramGenerator.cpp AbsProgramGenerator.h \ AbsRndNumGenerator.cpp AbsRndNumGenerator.h ArrayVariable.cpp \ - ArrayVariable.h Block.cpp Block.h Bookkeeper.cpp Bookkeeper.h \ - CFGEdge.cpp CFGEdge.h CGContext.cpp CGContext.h CGOptions.cpp \ - CGOptions.h CVQualifiers.cpp CVQualifiers.h Common.h \ - CommonMacros.h CompatibleChecker.cpp CompatibleChecker.h \ - Constant.cpp Constant.h CoverageTestExtension.cpp \ - CoverageTestExtension.h CrestExtension.cpp CrestExtension.h \ - DFSOutputMgr.cpp DFSOutputMgr.h DFSProgramGenerator.cpp \ - DFSProgramGenerator.h DFSRndNumGenerator.cpp \ - DFSRndNumGenerator.h DefaultOutputMgr.cpp DefaultOutputMgr.h \ + ArrayVariable.h Attribute.cpp Attribute.h Block.cpp Block.h \ + Bookkeeper.cpp Bookkeeper.h CFGEdge.cpp CFGEdge.h \ + CGContext.cpp CGContext.h CGOptions.cpp CGOptions.h \ + CVQualifiers.cpp CVQualifiers.h Common.h CommonMacros.h \ + CompatibleChecker.cpp CompatibleChecker.h Constant.cpp \ + Constant.h CoverageTestExtension.cpp CoverageTestExtension.h \ + CrestExtension.cpp CrestExtension.h DFSOutputMgr.cpp \ + DFSOutputMgr.h DFSProgramGenerator.cpp DFSProgramGenerator.h \ + DFSRndNumGenerator.cpp DFSRndNumGenerator.h \ + DefaultOutputMgr.cpp DefaultOutputMgr.h \ DefaultProgramGenerator.cpp DefaultProgramGenerator.h \ DefaultRndNumGenerator.cpp DefaultRndNumGenerator.h \ - DepthSpec.cpp DepthSpec.h \ - Effect.cpp Effect.h Enumerator.h Error.cpp Error.h \ - Expression.cpp Expression.h ExpressionAssign.cpp \ - ExpressionAssign.h ExpressionComma.cpp ExpressionComma.h \ - ExpressionFuncall.cpp ExpressionFuncall.h \ + DepthSpec.cpp DepthSpec.h Effect.cpp Effect.h Enumerator.h \ + Error.cpp Error.h Expression.cpp Expression.h \ + ExpressionAssign.cpp ExpressionAssign.h ExpressionComma.cpp \ + ExpressionComma.h ExpressionFuncall.cpp ExpressionFuncall.h \ ExpressionVariable.cpp ExpressionVariable.h ExtensionMgr.cpp \ ExtensionMgr.h ExtensionValue.cpp ExtensionValue.h Fact.cpp \ Fact.h FactMgr.cpp FactMgr.h FactPointTo.cpp FactPointTo.h \ @@ -499,13 +496,12 @@ csmith_SOURCES = AbsExtension.cpp AbsExtension.h \ FunctionInvocationUnary.h FunctionInvocationUser.cpp \ FunctionInvocationUser.h KleeExtension.cpp KleeExtension.h \ Lhs.cpp Lhs.h LinearSequence.cpp LinearSequence.h \ - OutputMgr.cpp OutputMgr.h \ - PartialExpander.cpp PartialExpander.h Probabilities.cpp \ - Probabilities.h ProbabilityTable.h RandomNumber.cpp \ - RandomNumber.h RandomProgramGenerator.cpp \ - SafeOpFlags.cpp SafeOpFlags.h Sequence.cpp Sequence.h \ - SequenceFactory.cpp SequenceFactory.h SequenceLineParser.h \ - Statement.cpp Statement.h \ + OutputMgr.cpp OutputMgr.h PartialExpander.cpp \ + PartialExpander.h Probabilities.cpp Probabilities.h \ + ProbabilityTable.h RandomNumber.cpp RandomNumber.h \ + RandomProgramGenerator.cpp SafeOpFlags.cpp SafeOpFlags.h \ + Sequence.cpp Sequence.h SequenceFactory.cpp SequenceFactory.h \ + SequenceLineParser.h Statement.cpp Statement.h \ StatementArrayOp.cpp StatementArrayOp.h StatementAssign.cpp \ StatementAssign.h StatementBreak.cpp StatementBreak.h \ StatementContinue.cpp StatementContinue.h StatementExpr.cpp \ @@ -643,6 +639,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AbsProgramGenerator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AbsRndNumGenerator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ArrayVariable.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Attribute.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Block.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Bookkeeper.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CFGEdge.Po@am__quote@ # am--include-marker @@ -908,6 +905,7 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/AbsProgramGenerator.Po -rm -f ./$(DEPDIR)/AbsRndNumGenerator.Po -rm -f ./$(DEPDIR)/ArrayVariable.Po + -rm -f ./$(DEPDIR)/Attribute.Po -rm -f ./$(DEPDIR)/Block.Po -rm -f ./$(DEPDIR)/Bookkeeper.Po -rm -f ./$(DEPDIR)/CFGEdge.Po @@ -1027,6 +1025,7 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/AbsProgramGenerator.Po -rm -f ./$(DEPDIR)/AbsRndNumGenerator.Po -rm -f ./$(DEPDIR)/ArrayVariable.Po + -rm -f ./$(DEPDIR)/Attribute.Po -rm -f ./$(DEPDIR)/Block.Po -rm -f ./$(DEPDIR)/Bookkeeper.Po -rm -f ./$(DEPDIR)/CFGEdge.Po diff --git a/src/Probabilities.cpp b/src/Probabilities.cpp index da4011557..85116bed8 100644 --- a/src/Probabilities.cpp +++ b/src/Probabilities.cpp @@ -499,6 +499,11 @@ Probabilities::set_single_name_maps() // group for simple types which equal probability set_single_name("safe_ops_size_prob", pSafeOpsSizeProb); + + /*------------GCC C Extensions---------------*/ + + //for choosing function attributes + set_single_name("func_attr_flag", pFuncAttrProb); } void @@ -539,6 +544,9 @@ Probabilities::initialize_single_probs() m[pBitFieldsSignedProb] = 50; m[pSafeOpsSignedProb] = 50; + //GCC C Extensions + m[pFuncAttrProb] = 30; + if (CGOptions::volatiles()) m[pRegularVolatileProb] = 50; else diff --git a/src/Probabilities.h b/src/Probabilities.h index bbee051d5..86014ecca 100644 --- a/src/Probabilities.h +++ b/src/Probabilities.h @@ -147,6 +147,8 @@ enum ProbName { pInt32Prob, pInt64Prob, + //for function attributes + pFuncAttrProb, }; #define MAX_PROB_NAME ((ProbName)(pStatementProb+1)) @@ -223,6 +225,9 @@ enum ProbName { #define BuiltinFunctionProb \ Probabilities::get_prob(pBuiltinFunctionProb) +#define FuncAttrProb \ + Probabilities::get_prob(pFuncAttrProb) + ////////////////////////////////////////////////// #define UNARY_OPS_PROB_FILTER \ Probabilities::get_prob_filter(pUnaryOpsProb) diff --git a/src/RandomProgramGenerator.cpp b/src/RandomProgramGenerator.cpp index 1296d5404..4a0ac3632 100644 --- a/src/RandomProgramGenerator.cpp +++ b/src/RandomProgramGenerator.cpp @@ -208,6 +208,10 @@ static void print_help() cout << " --lang-cpp : generate C++ code (C by default)." << endl << endl; cout << " --cpp11 : generate C++11 code (C++03 by default). Works if lang-cpp is enabled." << endl << endl; + //--------------------------GCC C Extensions-------------------------- + cout<< "------------------------------GCC C Extensions------------------------------" << endl << endl; + cout << " --function-attributes | --no-func-attributes: enable | disable generate common function attributes (disabled by default)." << endl << endl; + } static void print_advanced_help() @@ -795,6 +799,16 @@ main(int argc, char **argv) continue; } + if (strcmp (argv[i], "--function-attributes") == 0) { + CGOptions::func_attr_flag(true); + continue; + } + + if (strcmp (argv[i], "--no-function_attributes") == 0) { + CGOptions::func_attr_flag(false); + continue; + } + if (strcmp (argv[i], "--max-array-dim") ==0 ) { unsigned long dim; i++;