
##----------------------------------------------------------##
##                                                          ##
##  Universal Makefile Splint Function                      ##
##                                                          ##
##  Created : Wei Liu 07/05/20                              ##
##  Revision: [Last]Wei Liu 07/07/07                        ##
##                                                          ##
##----------------------------------------------------------##
 
##--------------------------------------
##
##  Make splinting program flags
##
##--------------------------------------

##是否有提示信息
SFLAG_HINTS  := #-hints

##是否用库信息代替头文件
SFLAG_INCLUDE  := +single-include 
#+never-include

##包含什么库
SFLAG_LIB    :=  +posixlib
##+nolib +nof -warnposix
##+unixlib
##+posixlib
#+nolib +nof -warnposix
##+nof
##+unixlib 
##+which_lib

##
SFLAG_DUMP  := 
##dump ./include/public.h ./include/pub_base.h ./include/includes.h 
SFLAG_LOAD  := 
##+load /usr/share/splint/lib/unixstrict.lcd
##load ./include/public.h ./include/pub_base.h ./include/includes.h

SFLAG_DIR    := 
##-I/work/r9/plat/public/src/include/splint
##-I/work/r9/plat/public/src/include/splint
##-I /usr/local/work/r9/plat/public/src/include/

##检查模式
SFLAG_TYPE   := -strict

##略过的头文件
SFLAG_SYS_HEADERS := +skip_sys_headers
SFLAG_ISO_HEADERS := 
#+skip_iso_headers
SFLAG_POSIX_HEADERS := 
##+skip_posix_headers

##每个头文件只检查一次
SFLAG_SINGLE_INCLUDE := +singleinclude

##系统文件目录
SFLAG_SYS_DIR := 
##+sys-dirs /work/r9/plat/public/src/include/splint

##函数参数有原型
SFLAG_PROTO_PARAMNAME := -protoparamname

##变量名是否为保留名
SFLAG_UNDERSCORE := -isoreserved -isoreservedinternal

## 在"/*"和"*/"中再次使用"/*"和"*/"
SFLAG_NESTCOMMENT := -nestcomment

##允许未说明导出变量、函数和类型
SFLAG_EXPORT_VAR  := -exportvar
SFLAG_EXPORT_FCN  := -exportfcn
SFLAG_EXPORT_TYPE := -exporttype
SFLAG_EXPORT_CONST  := -exportconst

##允许其他类型定义为BOOL型
SFLAG_LIKELY_BOOL := -likelybool

##两种类型相等
SFLAG_CHAR_INT    := +charint
SFLAG_BOOL_INT    := +boolint

##Report memory transfer errors for initializations to read-only string literals 
SFLAG_READONLY_TRANS  := -readonlytrans

##A string literal is assigned to a char array that smaller than the string literal needs
SFLAG_STRING_SMALLER  := -stringliteralsmaller

##A variable declared outside a macro body starts with the macro-var-prefix
SFLAG_MACRO_PREFIX    := -macrovarprefixexclude

##Initializer does not define all elements of a declared array
SFLAG_INITAL_ELEMENT  := -initallelements

##类型匹配
SFLAG_PARAM_TYPE  := -type

##Report modification errors in functions declared without a modifies clause
SFLAG_MODIFY  := -modnomods

##Use of a checked global in a function with no globals list
SFLAG_GLOBAL  := -glob-noglobs

##Use of internal state in function with no globals list
SFLAG_INTERNAL_GLOBS  := -internal-globs-noglobs

##Implicit checked qualifier on global variables and qualifier file static scope variables with no checking annotation
SFLAG_CHECK_GLOBAL  := -imp-checkedstrict-globs -imp-checkedstrict_statics

##Undocumented modification of a checked global variable in a function with no modifies clause
SFLAG_CHECK_GLOBAL_MODIFY  := -mod-globs-nomods

##Storage declared with observer may be modified through a call to an unconstrained function
SFLAG_OBSERVER_MODIFY  := -mod-observer-uncon

##忽略返回值
SFLAG_IGNORE_RETVAL := -retval

##while,if and for statement is not a block
SFLAG_WHILE_BLOCK  := -whileblock
SFLAG_IF_BLOCK   := -ifblock
SFLAG_FOR_BLOCK  := -forblock

##There is no finals else following an else if construct
SFLAG_ELSEIF_COMPLETE := -elseifcomplete

##允许指针进行数学运算
SFLAG_POINT_ARITH  := -ptrarith -nullptrarith

##An unconstrained function is called in a function body where modifications are checked.
SFLAG_UNCONSTRAIN_MODIFY  := -mod-uncon-nomods

##NO effect of unconstrained functions
SFLAG_EFFECT_UNCONSTRAIN  := -no-effect-uncon

##Type-mismatch in parameter corresponding to format code in a printflike or scanflike function
SFLAG_FORMAT-TYPE  := -format-type

##An actual parameter that is passed as a unique formal parameter is aliased by another parameter or global variable
SFLAG_ALIASING  := -alias-unique -ret-alias#-may-alias-unique

##Transfer Errors flag
SFLAG_STORAGE_TRANSFER := -onlytrans -temptrans -unqualified-trans -immediatetrans

##Report errors for break statements inside a nested while, for or switch
SFLAG_DEEP_BREAK  := -deep-break #-switch-switch-break -loop-loop-break

##Storage has inconsistent states of alternate paths through a branch
SFLAG_INCONSISTENT_BRANCH  := -branch-state

##There is a non-empty case in a switch not followed by a break.
##Likely infinite loop is detected
##Likely infinite loop is detected.  Loop test or body calls an unconstrained function that may produce an undetected modification
SFLAG_PROBLEMATIC_CTR  := -case-break -infloops -infloopsuncon

##An expression may be undefined because a sub-expression contains a call to an unconstrained function (no modifies clause) 
##that may modify something that may be modified or used by another sub-expression
SFLAG_UNDEFINED_EVALORDER  := -eval-order-uncon

##Only storage transferred to an unqualified global or static reference. 
##This may lead to a memory leak, since the new reference is not necessarily released
SFLAG_INITIALIZERS  := -only-unq-global-trans

##Primitive operation does not type check strictly
SFLAG_PRIMITIVE_OPERA  := -strict-ops -bitwise-signed

##Unused Declarations （未使用的声明）
SFLAG_DECLARARIONS  := -field-use -fcnuse -param-use -typeuse -varuse -enummemuse

##Function, variable, iterator or constant declared but never defined (未初始化)
SFLAG_COMPLETE_PRG  := -decl-undef

##A declaration is exported but not used outside this module or not appear in a header file
SFLAG_EXPORTS  := -export-local -export-header

##把warning输出到文件splint_warn中
SFLAG_WARN_FILE  := #+warning-stream splint_warn

##把致命错误输出到文件splint_error中
SFLAG_ERROR_FILE  := #+error-stream splint_error

##文件覆盖
SFLAG_STREAM_OVERWRITE  := -streamoverwrite

##An abstract type defined in M.h (or specified in M.lcl) is accessible in M.c
SFLAG_ACCESS  := -access-module

##Function definition is in old style syntax.  Standard prototype syntax is preferred. 
SFLAG_ISO_CONFORMANCE  := #-old-style

##Use of function that may lead to buffer overflow
SFLAG_BUFFER  := -bufferoverflowhigh

##A function is declared without a parameter list prototype
SFLAG_FUNC_NOPARAM := -noparams

##Operand of sizeof operator is a type
SFLAG_SIZEOF_TYPE  := -sizeoftype

##Storage derivable from a parameter, return value or global variable is not completely defined
SFLAG_COMP_DEF  := -compdef

##Behavior of an expression is unspecified or implementation-dependent 
##because sub-expressions contain interfering side effects that may be evaluated in any order
SFLAG_EVAL_ORDER  := -eval-order

##try to recover code 
SFLAG_TRY_TO_RECOVER  := #+trytorecover

##返回一个NULL指针
SFLAG_NULL_RET  := -nullret

##A possibly null pointer is reachable from a parameter or global variable that is not declared using a /*@null@*/ annotation
SFLAG_NULL_STATE  := -nullstate

##The value of a location that may not be initialized on some execution path is used
SFLAG_USE_BEFORE_DEF  := -usedef

##编译时不知道参数类型 Format parameter is not known at compile-time  例如:sprintf(mgcpAsciTempBuf, msg)
SFLAG_FORMAT_CONST  := -format-const

##Argument to exit has implementation defined behavior.  The only valid arguments to exit are EXIT_SUCCESS, EXIT_FAILURE and 0.  
##An error is reported if Splint can determine statically that the argument to exit is not one of these
SFLAG_EXIT_ARG  := -exitarg

##An extern declaration is used inside a function body
SFLAG_EXTERN  := -nested-extern



SFLAG_OLD_STTLE := -oldstyle


SFLAG_SHIFT_NEG := -shiftnegative


SFLAG_PREPROC   := -preproc

##all splint flags

SPLINT_FLAGS := $(SFLAG_LIB) $(SFLAG_TYPE) $(SFLAG_SYS_HEADERS) $(SFLAG_ISO_HEADERS)\
                $(SFLAG_POSIX_HEADERS) $(SFLAG_SINGLEINCLUDE) $(SFLAG_WARN)\
                $(SFLAG_UNDERSCORE) $(SFLAG_NESTCOMMENT) $(SFLAG_EVAL_ORDER)\
                $(SFLAG_PROTO_PARAMNAME) $(SFLAG_EXPORT_VAR) $(SFLAG_EXPORT_FCN)\
                $(SFLAG_EXPORT_TYPE) $(SFLAG_LIKELY_BOOL) $(SFLAG_CHAR_INT)\
                $(SFLAG_READONLY_TRANS) $(SFLAG_STRING_SMALLER) $(SFLAG_MACRO_PREFIX)\
                $(SFLAG_INITAL_ELEMENT) $(SFLAG_PARAM_TYPE) $(SFLAG_GLOBAL)\
                $(SFLAG_CHECK_GLOBAL) $(SFLAG_CHECK_GLOBAL_MODIFY) $(SFLAG_IGNORE_RETVAL)\
                $(SFLAG_INTERNAL_GLOBS) $(SFLAG_MODIFY) $(SFLAG_BOOL_INT)\
                $(SFLAG_WHILE_BLOCK) $(SFLAG_HINTS) $(SFLAG_IF_BLOCK) $(SFLAG_FOR_BLOCK)\
                $(SFLAG_POINT_ARITH) $(SFLAG_ELSEIF_COMPLETE) $(SFLAG_UNCONSTRAIN_MODIFY)\
                $(SFLAG_EFFECT_UNCONSTRAIN) $(SFLAG_OBSERVER_MODIFY)\
                $(SFLAG_FORMAT-TYPE) $(SFLAG_ALIASING) $(SFLAG_STORAGE_TRANSFER)\
                $(SFLAG_DEEP_BREAK) $(SFLAG_INCONSISTENT_BRANCH) $(SFLAG_PROBLEMATIC_CTR)\
                $(SFLAG_UNDEFINED_EVALORDER) $(SFLAG_INITIALIZERS) $(SFLAG_PRIMITIVE_OPERA)\
                $(SFLAG_DECLARARIONS) $(SFLAG_COMPLETE_PRG) $(SFLAG_EXPORTS) $(SFLAG_INCLUDE)\
                $(SFLAG_STREAM_OVERWRITE) $(SFLAG_WARN_FILE) $(SFLAG_ERROR_FILE)\
                $(SFLAG_ACCESS) $(SFLAG_ISO_CONFORMANCE) $(SFLAG_BUFFER) $(SFLAG_SIZEOF_TYPE)\
                $(SFLAG_COMP_DEF) $(SFLAG_FUNC_NOPARAM) $(SFLAG_TRY_TO_RECOVER)\
                $(SFLAG_EXPORT_CONST) $(SFLAG_DUMP) $(SFLAG_LOAD) $(SFLAG_NULL_RET)\
                $(SFLAG_NULL_STATE) $(SFLAG_USE_BEFORE_DEF) $(SFLAG_FORMAT_CONST)\
                $(SFLAG_EXIT_ARG) $(SFLAG_EXTERN) $(SFLAG_OLD_STTLE) $(SFLAG_DIR)\
                $(SFLAG_SHIFT_NEG) $(SFLAG_PREPROC)
                  
##--------------------------------------
##
##  MAKE_INDENT template
##
##------------------------------------

define SPLINT_FILE
@echo -e "Splinting: $(notdir $(1)) \t\t\t please wait ..."
@nohup splint $(SPLINT_FLAGS) $(1) | sed '$d' | sed '1,2d' |\
 sed '/Splint /d' | sed '/Finished /d' |\
 sed '/Cannot continue/d'

endef

##@echo $(SPLINT_FLAGS)
define MAKE_SPLINT
@echo

$(foreach file,$(1),$(call SPLINT_FILE, $(file)))
@echo
@echo =======================================End======================================
endef