v0.5.1 (2017-08-18)

It is finally there. Sparse 0.5.1 is released.

I consider this the best quality of release of sparse I ever experienced so far. There are lots of enhancement and bug fixes incorporate into this release.

I would like to thank every one that contributes to this release, people who submit patches, perform testing and send bug reports.

I want to specially thank Luc Van Oostenryck who makes this release possible. He has 242 commits in this release, far more than any one else.

The development effort for the next release has already began.

Finally, I would like to call for developers joining the sparse project. If you are interested in modern compilers, reading compiler books and want some excise. Sparse is a good project to start.

Sparse is very small, the project compiles under 10 seconds. It can digest the full kernel source file, generate internal byte code representation and perform check on it. All this happens in 1/10 of the time it took gcc to compile the same source file.

Here is some project ideas, https://git.kernel.org/pub/scm/devel/sparse/sparse.git/tree/Documentation/project-ideas.md?h=v0.5.1



Aaro Koskinen (1):
  • build: allow use of PKG_CONFIG to override pkg-config

Andy Shevchenko (1):
  • lib.c: skip –param parameters

Ard Biesheuvel (2):
  • sparse: treat function pointers as pointers to const data

  • Ignore pure attribute in assignement

Azat Khuzhin (2):
  • sparse, llvm: compile: skip function prototypes to avoid SIGSEGV

  • validation/prototype: regression for skipping prototypes

Christian Borntraeger (1):
  • s390x: add the proper defines for data types

Christopher Li (24):
  • Minor clean up for option handling

  • round up the array element size to byte align

  • Make same_symbol list share the same scope

  • rename -Werror to -Wsparse-error

  • teach next_designators() use array_element_offset()

  • Ptr list sorting should use memmove instead of memcpy

  • Make macro expanded string immutable

  • Fix warning compiling sparse-llvm

  • Adding ignored attribute optimize

  • Let create_symbol check for previous same symbol

  • Add full list of gcc attribute

  • bump sparse’s version to 0.5.1-rc4

  • Adding gcc attribute no_gccisr

  • Add test case for the wine dead loop bug

  • Makefile: clean up and simplify

  • Makefile: add selfcheck target

  • Adding _Pragma()

  • fix warnings report by selfcheck

  • Adding gcc attribute noipa etc

  • Adding document for sparse patch submit process

  • Documents: project ideas

  • test-inspect: handle special case iter==NULL

  • test-inspect: Detect gtk3 then gtk2 package

  • Sparse 0.5.1

Cody P Schafer (3):
  • build: allow use of LLVM_CONFIG to override llvm-config config script

  • sparse{i,c}: use LLVM_CONFIG to find llc and lli

  • parse: support c99 [static …] in abstract array declarators

Dan Carpenter (1):
  • ptrlist: reading deleted items in NEXT_PTR_LIST()

Daniel Wagner (1):
  • parse: Add comment to struct statement

Edward Cree (1):
  • Allow casting to a restricted type if !restricted_value

Emilio G. Cota (1):
  • Define __CHAR_BIT__

Emily Maier (2):
  • linearize: Emit C99 declarations correctly

  • validation: Check C99 for loop variables

Hans Verkuil (3):
  • Add test case for extern array

  • Add test case for anonymous union initializer

  • Add test case for the ioc type check

Heiko Carstens (1):
  • sparse/parse.c: ignore hotpatch attribute

Jeff Layton (2):
  • sparse: make bits_to_bytes round up instead of down

  • Handle SForced in storage_modifiers

Joe Perches (1):
  • sparse: Allow override of sizeof(bool) warning

Johannes Berg (1):
  • implement constant-folding in __builtin_bswap*()

John Keeping (3):
  • validation/sizeof-bool: fix broken test case

  • evaluate: split out implementation of compatible_assignment_types

  • Support GCC’s transparent unions

Lance Richardson (3):
  • sparse: ignore __assume_aligned__ attribute

  • sparse: update __builtin_object_size() prototype

  • sparse: add support for _Static_assert

Linus Torvalds (5):
  • Add warning about duplicate initializers

  • Use any previous initializer to size a symbol

  • Fix error at anoymous unions

  • Fix scoping of extern symbols in block scope

  • Fix initializers in anonymous structs and unions

Luc Van Oostenryck (242):
  • Teach sparse about the __COUNTER__ predefined macro

  • Fix size calculation of unsized bool array

  • Do not drop ‘nocast’ modifier when taking the address.

  • fix mixup in “Handle SForced in storage_modifiers”

  • Fix type checking of variadic functions

  • add missing #include “char.h” to char.c

  • make ‘ignored_attributes[]’ static

  • cleanup: remove evaluate_arguments()’s unused argument

  • Warn on unknown attributes instead of throwing errors

  • Remove unneeded variable in integer_promotion()

  • fix discarded label statement

  • add test case for builtin bswap with constant args

  • make ptrlist walking against robust against empty blocks

  • let “compile” not crash on bools

  • give comparable label’s names to basic blocks

  • OP_SWITCH should use ‘insn->cond’ instead of ‘insn->target’

  • remove unused field ‘multijump’ in struct instruction

  • storage should not be inherited by pointers

  • testsuite: simplify test function-pointer-inheritance

  • use a shorter name for function-pointer-modifier-inheritance.c

  • testsuite: test modifiers preserved by ‘&’ operator

  • testsuite: test modifiers preserved by ‘typeof()’

  • some modifiers need to be preserved by ‘typeof()’

  • Update maintainers in the manpage

  • cgcc should not define non-reserved identifiers

  • recursive phi_defines cannot happen

  • fix missing element in types declaration

  • add support for __int128

  • fix typing error in compound assignment

  • llvm: fix typing when comparing to a constant

  • llvm: remove unneeded OP_COPY support

  • fix cast to bool

  • unssa: do not try to update liveness

  • unssa: simplify rewrite of OP_PHISOURCE

  • unssa: try to avoid some OP_PHI copies

  • unssa: eliminate trivial phisrc copies

  • unssa: update comment about the unneeded copies

  • volatile loads must not be simplified

  • fix superfluous phisrc

  • fix phisrc mixup

  • missing load simplification

  • fix value of label statement

  • C11: teach sparse about ‘_Thread_local’

  • C11: teach sparse about ‘_Noreturn’

  • C11: teach sparse about ‘_Alignof()’

  • C11: teach sparse about ‘_Alignas()’

  • C11: teach sparse about ‘–std={c11,gnu11}’

  • fix cast’s target type info

  • fix crash while testing between conditional & unconditional OP_BR

  • kill uses of replaced instructions

  • fix killing OP_PHI instructions

  • fix killing OP_CAST & friends

  • fix killing OP_SELECT

  • fix killing OP_COMPUTEDGOTO

  • explicitely ignore killing OP_ENTRY

  • cleanup kill_instruction()

  • fix conditional context test case with void

  • add helper: is_scalar_type()

  • validate expression’s type in conditionals

  • remove unused arg in uses/defs functions

  • add testcase for wrong early escape conversion

  • warn on unknown escapes after preprocessing

  • remove ‘Escape’ from token character class

  • fix killing OP_SETVAL instructions

  • define __LP64__ & _LP64 if arch_m64 is enabled

  • add an helper for common predefined macros

  • define __LONG_MAX__ & __SIZEOF_POINTER__

  • move OP_MUL simplification in a separate function

  • simplify ‘(x / 1)’ to ‘x’

  • simplify ‘(x * -1)’ to ‘-x’

  • simplify ‘(x / -1)’ to ‘-x’ (but only for signed division)

  • simplify ‘(x % 1)’ into ‘0’

  • simplify ‘~(~x)’ and ‘-(-x)’ to ‘x’

  • simplify ‘(x || 1)’ to ‘1’

  • simplify ‘(x op x)’ to ‘0’, ‘1’ or ‘x’

  • add warning option ‘-Wtautological-compare’

  • simplify comparisons followed by an equality test against 0 or 1

  • simplify ‘(x || x)’ and ‘(x && x)’

  • add support for LLP64 arch

  • move evaluation & expansion of builtins in a separate file

  • let identical symbols share their evaluate/expand methods

  • expand __builtin_bswap*() with constant args

  • testsuite: give a proper name to the ‘binary-constant’ test

  • testsuite: make tests known to fail effectively fail

  • testsuite: simplify the ioc-typecheck case

  • testsuite: add a simple test for -Wenum-mismatch

  • testsuite: add tag to ignore the output/error

  • testsuite: report as error tests known to fail but which succeed

  • allow to launch the test suite from the project root dir

  • testsuite: check patterns presence or absence in output

  • testsuite: add some selfchecking

  • testsuite: check the nbr of times a pattern should be present

  • testsuite: use ‘error’ instead of ‘info’ for successful tests known to fail

  • testsuite: get ‘check-known-to-fail’ earlier

  • testsuite: allow quieter error reporting

  • testsuite: quieter error reporting for ‘known-to-fail’

  • cleanup: there is no ‘struct phi’ to allocate

  • remove unused field ‘multijmp’ in struct statement

  • remove unused field ‘goto_bb’ in struct statement

  • fix show-parse()’s labels

  • add killing of OP_SLICEs

  • add killing of OP_PHISOURCEs

  • add helper kill_use_list()

  • fix killing of OP_PHIs

  • fix clear_phi(), replace it by kill_instruction()

  • remove unused clear_phi()

  • fix killing of otherwise not-handled instructions

  • kill_instruction() may need to be forced or not

  • add killing of pure calls

  • fix killing OP_CALL via pointers

  • add killing of non-volatile loads

  • add killing of stores

  • fix killing of rewritten loads

  • use kill_instruction() when killing an OP_PHI during CSE

  • use kill_instruction() when killing any instructions during CSE

  • fix OP_PHI usage in try_to_simplify_bb()

  • simplify float-to-float casts that doesn’t change size

  • CSE: add test cases for comparisons duality

  • CSE: use commutativity to identify equivalent instructions

  • CSE: avoid hashing removed instructions

  • fix expansion cost of pure functions

  • add missing braces around FOR_EACH_PTR loop

  • make -Wbitwise operational again

  • use option: ‘-Woverride-init’

  • add test case for warnings about overlapping initializers

  • allow to warn on all overlapping initializers

  • fix checking of overlapping initializer

  • ignore whole-range overlapping initializer

  • fix usage in simplify_seteq_setne()

  • fix size of loaded bitfields

  • split OP_BR between unconditional & conditional: OP_CBR

  • remove unused helper is_branch_goto()

  • replace test for c99 for-loop initializers

  • add test case for scope of C99 for-loop declarations

  • add test cases for storage of c99 for-loop declarations

  • add an optional validation method to external_declaration()

  • check the storage of C99 for-loop initializers

  • move ‘extern with initializer’ validation after the validate method

  • use VOID instead of directly using &void_pseudo

  • teach sparse about -Waddress

  • add is_func_type()

  • warn if testing the address of a function

  • add is_array_type()

  • warn if testing the address of an array

  • fix evaluation of a function or array symbol in conditionals

  • fix is_scalar_type()

  • fix test for cast to bool on 32bit machines

  • predefine __INT_MAX__ and friends

  • predefine __SIZEOF_INT__ & friends

  • fix test validation/div.c

  • fix cast to pointer to floating-point

  • do not depends on limits.h to test __CHAR_BIT__

  • fix expansion of integers to floats

  • avoid crash with test-linearize -vv

  • fix OP_PHI usage in try_to_simplify_bb(), correctly

  • be more careful with concat_user_list()

  • avoid useless warning for ‘bool <- restricted type’ conversion

  • introduce REPEAT_CFG_CLEANUP

  • let kill_unreachable_bbs() clear REPEAT_CFG_CLEANUP

  • fix: kill unreachable BBs after killing a child

  • ignore VOID when trying to if-convert phi-nodes

  • fix boolean context for OP_AND_BOOL & OP_OR_BOOL

  • fix missing reload

  • keyword: add test case for reserved ‘_Static_assert’

  • keyword: regroup the [reserved] keywords

  • keyword: explicitly add C99 & C11 keywords

  • keyword: add more reserved keywords to the test case

  • keyword: add a comment about NS_TYPEDEF & reserved keywords

  • keyword: no pre-declaration needed for attribute names

  • add get_<allocator>_stats()

  • add show_allocation_stats()

  • add helper handle_simple_switch()

  • teach sparse how to handle ‘-fmem-report’

  • use -fmem-report to report allocation stats

  • testsuite: cleanup result files

  • fix: kill old branch in insert_branch()

  • returns the correct type when evaluating NULL

  • remove bit_size & bit_offset from struct access_data

  • add test case for linearize_initializer() of bitfields

  • fix implicit zero initializer.

  • remove alignment from struct access_data

  • remove origval from struct access_data

  • add support for a new flag: -fdump-linearize[=only]

  • more tests for implicit ‘bool <- restricted’ casts

  • avoid warning on explicit ‘bool <- restricted’ casts

  • define ident_list

  • teach sparse how to dump macro definitions

  • fix hardcoded size of wide chars

  • avoid to redefine __INT_MAX__ and friends

  • fix definition of __SCHAR_MAX__ & friends

  • teach sparse how to handle -dD flag

  • let -dD report macro definitions

  • testsuite: get all tags in once

  • testsuite: grep the expected output only when needed

  • testsuite: grep the output patterns only when needed

  • testsuite: use shell arithmetic instead of fork-execing expr

  • testsuite: remove unneeded ‘./’ before commands

  • testsuite: avoid fork+execing basename

  • teach cgcc about OSX aka darwin

  • ret-void: add test case for toplevel asm

  • ret-void: warn for implicit type

  • use NULL instead of 0 in testcases.

  • finer control over error vs. warnings

  • Add more declarations for more builtin functions

  • keep the warnings table alphabetically sorted

  • cgcc: alphasort warning names in check_only_option()

  • cgcc: add missing warning names to check_only_option()

  • cgcc: filter-out ‘-fdump-linearize[=…]’

  • memcpy()’s byte count is unsigned

  • add support for -Wmemcpy-max-count

  • add support for -fmemcpy-max-count

  • fix: add missing examine in evaluate_dereference()

  • fix OP_PHI usage in try_to_simplify_bb() only when non-bogus

  • fix: try_to_simplify_bb eargerness

  • add fallback for missing __builtin_bswapXX()

  • fix: __builtin_bswap{16,32,64}() constantness

  • dissect: use built_in_ident() instead of MK_IDENT()

  • teach sparse about -m{big,little}-endian

  • teach sparse about __{BIG,LITTLE}_ENDIAN__

  • teach sparse about __BYTE_ORDER__ & __ORDER_{BIG,LITTLE}_ENDIAN__

  • cgcc: teach cgcc about arm64

  • cgcc: teach cgcc about ppc64[le]

  • cgcc: teach cgcc about arm

  • bump sparse’s version to -rc3

  • fix ptrlist corruption while killing unreachable BBs

  • fix infinite simplification loops

  • fix BB dependencies on phi-nodes

  • fix crash when ep->active is NULL

  • fix crash in rewrite_branch()

  • fix some crashes in add_dominators()

  • fix crash with sym->bb_target == NULL

  • take comma expr in account for constant value

  • fix: give a type to bad cond expr with known condition

  • ptrlist: add a counter for the number of removed elemnets

  • ptrlist: adjust ptr_list_size for the new ->rm field

  • ptrlist: add MARK_CURRENT_DELETED

  • ptrlist: avoid iteration on NULL entries

  • mark pseudo users as deleted instead of removing them

  • testsuite: add support for commands with timeout

  • Remove single-store shortcut

  • Bump sparse’s version to -rc5

  • Sparse v0.5.1

Michael Stefaniuc (3):
  • Add the __builtin functions needed for INFINITY and nan().

  • Add a define for __builtin_ms_va_copy()

  • Add tests for the builtin INF and nan() functions.

Oleg Nesterov (3):
  • dissect: teach do_expression() to handle EXPR_OFFSETOF

  • dissect: teach do_initializer() to handle the nested EXPR_IDENTIFIER’s

  • dissect: s/mode_t/usage_t/ in report_member()

Omar Sandoval (1):
  • sparse-llvm: Fix LLVM 3.5 linker errors

Pavel Roskin (1):
  • Use LLVM_CONFIG instead of llvm-config in Makefile

Ramsay Jones (15):
  • Add the __restrict__ keyword

  • sparse: add ‘gnu_inline’ to the ignored attributes

  • don’t call isdigit/tolower with a char argument

  • Makefile: suppress error message from shell

  • don’t run sparse{c,i} tests when sparse-llvm is disabled

  • Add support for multiarch system header files

  • cgcc: use only the cc command to determine $gcc_base_dir

  • cgcc: use $ccom to set $multiarch_dir if not specified

  • test-suite: remove bashism to avoid test failures

  • cgcc: avoid passing a sparse-only option to cc

  • parse.c: remove duplicate ‘may_alias’ ignored_attributes

  • compile-i386.c: don’t ignore return value of write(2)

  • sparse: add ‘alloc_align’ to the ignored attributes

  • lib: workaround the ‘redeclared with different type’ errors

  • Makefile: pass -Wno-vla to sparse while checking pre-process.c

Randy Dunlap (1):
  • documentation: update email reference link

Rui Teng (1):
  • sparse: add no_sanitize_address as an ignored attribute

Thomas Graf (1):
  • sparse: Make -Werror turn warnigns into errors

Tony Camuso (2):
  • .gitignore: add cscope and Qt project files

  • Add default case to switches on enum variables