]> git.ipfire.org Git - thirdparty/gcc.git/commit
[modula2] Uninitialized variable static analysis improvements
authorGaius Mulley <gaiusmod2@gmail.com>
Tue, 18 Jul 2023 15:31:49 +0000 (16:31 +0100)
committerGaius Mulley <gaiusmod2@gmail.com>
Tue, 18 Jul 2023 15:31:49 +0000 (16:31 +0100)
commitb80e3c468e373cc6fd4e41a5879dbca95a40ac8c
treea0f4d0da67f82ad968eb2fae01526b4f1fdb58cb
parentcbe5f6859a73b2acf203bd7d13f9fb245d63cbd4
[modula2] Uninitialized variable static analysis improvements

This patch fixes many limitations of the uninitialized static analysis.
NEW is understood, local variable pointers and non var parameters
will be tracked.

gcc/ChangeLog:

* doc/gm2.texi (Semantic checking): Change example testwithptr
to testnew6.

gcc/m2/ChangeLog:

* Make-lang.in: Minor formatting change.
* gm2-compiler/M2GCCDeclare.mod
(DeclareUnboundedProcedureParameters): Rename local variables.
(WalkUnboundedProcedureParameters): Rename local variables.
(DoVariableDeclaration): Avoid declaration of a variable if
it is on the heap (used by static analysis only).
* gm2-compiler/M2GenGCC.mod: Formatting.
* gm2-compiler/M2Quads.def (GetQuadTrash): New procedure function.
* gm2-compiler/M2Quads.mod (GetQuadTrash): New procedure function.
(QuadFrame): Add Trash field.
(BuildRealFuncProcCall): Detect ALLOCATE and DEALLOCATE and create
a heap variable for parameter 1 saving it as the trashed variable
for static analysis.
(GenQuadOTrash): New procedure.
(DisplayQuadRange): Bugfix.  Write the scope number.
* gm2-compiler/M2SymInit.mod: Rewritten to separate LValue
equivalence from LValue to RValue pairings.  Comprehensive
detection of variant record implemented.  Allow dereferencing
of pointers through LValue/RValue chains.
* gm2-compiler/SymbolTable.def (PutVarHeap): New procedure.
(IsVarHeap): New procedure function.
(ForeachParamSymDo): New procedure.
* gm2-compiler/SymbolTable.mod (PutVarHeap): New procedure.
(IsVarHeap): New procedure function.
(ForeachParamSymDo): New procedure.
(MakeVariableForParam): Reformatted.
(CheckForUnknownInModule): Reformatted.
(SymVar): Add field Heap.
(MakeVar): Assign Heap to FALSE.

gcc/testsuite/ChangeLog:

* gm2/switches/uninit-variable-checking/pass/assignparam.mod: New test.
* gm2/switches/uninit-variable-checking/pass/tiny.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/fail/switches-uninit-variable-checking-procedures-fail.exp:
New test.
* gm2/switches/uninit-variable-checking/procedures/fail/testnew.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/fail/testnew2.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/fail/testnew3.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/fail/testnew4.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/fail/testnew5.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/fail/testnew6.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/fail/testptrptr.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/pass/assignparam2.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/pass/switches-uninit-variable-checking-procedures-pass.exp:
New test.
* gm2/switches/uninit-variable-checking/procedures/pass/testnew5.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/pass/testnew6.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/pass/testparamlvalue.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/pass/testparamrvalue.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/pass/testproc.mod: New test.
* gm2/switches/uninit-variable-checking/procedures/pass/testptrptr.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
27 files changed:
gcc/doc/gm2.texi
gcc/m2/Make-lang.in
gcc/m2/gm2-compiler/M2GCCDeclare.mod
gcc/m2/gm2-compiler/M2GenGCC.mod
gcc/m2/gm2-compiler/M2Quads.def
gcc/m2/gm2-compiler/M2Quads.mod
gcc/m2/gm2-compiler/M2SymInit.mod
gcc/m2/gm2-compiler/SymbolTable.def
gcc/m2/gm2-compiler/SymbolTable.mod
gcc/testsuite/gm2/switches/uninit-variable-checking/pass/assignparam.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/pass/tiny.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/fail/switches-uninit-variable-checking-procedures-fail.exp [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/fail/testnew.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/fail/testnew2.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/fail/testnew3.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/fail/testnew4.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/fail/testnew5.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/fail/testnew6.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/fail/testptrptr.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/pass/assignparam2.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/pass/switches-uninit-variable-checking-procedures-pass.exp [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/pass/testnew5.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/pass/testnew6.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/pass/testparamlvalue.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/pass/testparamrvalue.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/pass/testproc.mod [new file with mode: 0644]
gcc/testsuite/gm2/switches/uninit-variable-checking/procedures/pass/testptrptr.mod [new file with mode: 0644]