/
ChangeLog.txt
4288 lines (4061 loc) · 180 KB
/
ChangeLog.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Version 2.2.0 (Mao, coming up)
+ Architecture
+
+ Report
+
+ Analysis
+
+ Tokenizer
+
Version 2.1.9 (Yin, 2020-10-01)
+ Architecture
+ Removed old and unused commands
+ Modernized usage of docker as phpexec
+ New directive php_extensions to managed list of ext
+ Report
+ Ambassador : removed 3 gremlins from typehint stats, added scalar types
+ New Migration80 report, dedicated to PHP 8.0 migrations
+ New Stubs.ini report, dedicated to exakat extensions production
+ Analysis
+ New analysis : report arguments which are not nullable because of constants.
+ New analysis : could use stringable interface
+ New analysis : suggest explode()'s third argument when applicable
+ New analysis : suggest PHP 8.0 promoted properties
+ New analysis : report arrays with negative index, and auto-indexing
+ New analysis : report unsupported types with operators
+ New analysis : report usage of track_errors directive (PHP 8.0)
+ New analysis : report useless types on __get/__set
+ New analysis : count the number of use expressions in a file
+ New analysis : Avoid modifying typed arguments
+ New analysis : Report Assumptions in the code
+ New analysis : array_fill() usage with objects
+ New analysis : mismatch between parameter name and type
+ Updated analysis : magic methods definitions also find usage for __invoke()
+ Updated analysis : noscream operator usage may have exceptions
+ Updated analysis : identical methods and identical closures
+ Updated data : list of exceptions and their emitters
+ Tokenizer
+ Upgraded detection of extensions' structures, beyond functions
Version 2.1.8 (Chou, 2020-09-18)
+ Architecture
+ added '--' options, and kept the '-' options, for migration purposes. (--format and -format are both available)
+ Added support for PHP 8 attributes in dump.sqlite
+ Added 'precision' to rule docs.
+ Moved all but one data collection from Dump -collect to Dump/ analysis.
+ Report
+ New report : SARIF
+ Typehint suggestion report : Tick classes when they are fully covered
+ Weekly report : fix donuts display.
+ Stubsjson : Added support for PHP attributes
+ Stubs : Added support for PHP attributes
+ Analysis
+ New ruleset : CI-Checks
+ New analysis : 'Multiple declare(strict_types = 1)'
+ New analysis : 'No more (unset) in PHP 8'
+ New analysis : Cancel methods in parent : when methods should not have been abstracted in parent class.
+ New analysis : '$php_errormsg is removed in PHP 8'
+ New analysis : 'Mismatch Parameter Name' checks parameter names between inherited methods for consistency
+ Upgraded analysis : 'Useless Arguments' is accelerated
+ Upgraded analysis : 'Don't use Void' weeded out false positives
+ Upgraded analysis : 'Wrong type for native calls' weeded out false positives
+ Upgraded analysis : 'Non static methods called statically' was refactored for PHP 8.0 support
+ Upgraded analysis : 'PHP Keywords' includes 'match'
+ Upgraded analysis : 'Useless instruction' reports '$a ?? null' as useless.
+ Upgraded analysis : 'Uncaught exceptions' is extended to local variables
+ Upgraded analysis : 'Foreach favorites' also covers the keys
+ Upgraded analysis : 'Should Preprocess' skips expressions with constants
+ Upgraded analysis : 'Compare Hashes' has more functions covered
+ Removed analysis : 'Normal Properties' : no need anymore.
+ Tokenizer
+ Moved isPhp attribute to Task/Load plugin
+ Created isExt attribute to Task/Load plugin
Version 2.1.7 (zi, 2020-09-07)
+ Architecture
+ Refactored loading class, to keep query load at optimal size for Gremlin
+ GC during load to free memory
+ More typehints
+ Move several collections to Dump/ ruleset
+ Report
+ Upgraded Typesuggestion report with report on closures and arrow functions
+ Added Arrowfunctions in inventories
+ Added collection of arguments and details for closures and arrowfunctions
+ Analysis
+ New analysis : Could Be In Parent : suggest methods that should be defined in a parent
+ New analysis : Don't pollute namespace
+ New analysis : report insufficient return typehints
+ Upgraded analysis : 'Method signature must be compatible' now PHP 8.0 compatible
+ Upgraded analysis : 'Wrong type with native function' fixes false positives
+ Upgraded analysis : 'Same condition' added coverage for || conditions
+ Upgraded analysis : 'Missing returntype' extended to class typehints
+ Upgraded analysis : 'Should Use This' also covers special functions like get_class_called()
+ Upgraded analysis : 'No concat in loop' skips nested loops
+ Upgraded analysis : 'Always false' covers typehint usage
+ Upgraded analysis : 'NoChoice' doesn't report large expressions
+ Upgraded analysis : 'Dont mix PlusPlus' skip () and =
+ Upgraded analysis : 'Fallthrough' don't report final cases without break
+ Checked unit tests : 3663 / 3630 test pass (99% pass)
+ Tokenizer
+ Removed 'root' property
+ Upgraded to new Attributes #[] in detection and normalisation
+ Fixed constant detection within instanceof
+ Created RETURN and RETURNED for Arrowfunctions (there is no return otherwise)
+ Parent method also calls children methods when those are not defined there
+ Support for multiple attributes in one syntax
Version 2.1.6 (Night Patrol Deity, 2020-08-28)
+ Architecture
+ More typehints coverage
+ Various speed-up
+ Lighter logging with gremlin
+ Fixed installation path
+ Report
+ Upgraded Typesuggestion report
+ Upgraded Stubs and Stubsjson
+ Analysis
+ New analysis : report PHP 8.0 unknown parameters
+ New analysis : overwritten methods with different argument counts
+ New analysis : Warn of iconv and TRANSLIT for portability
+ New analysis : Warn of glob and {} for portability
+ Upgraded analysis : 'Useless check' covers new situations.
+ Upgraded analysis : 'Abstract away' now covers new calls.
+ Upgraded analysis : 'Must return Typehint' skips Void.
+ Upgraded analysis : 'Missing new' with less false positives
+ Checked unit tests : 3559 / 3630 test pass (98% pass)
+ Tokenizer
+ Support for Virtualmethod and imports from traits
+ Refactored Usenamespace atom
+ Fixed calculations of fullnspath for static::class
+ Fixed detection of null/true/false in new()
+ Added support for T_BAD_CHARACTER
Version 2.1.5 (Day Patrol Deity, 2020-08-04)
+ Architecture
+ Fixed comment size estimation by 1 for T_COMMENT
+ Added more typehints to code
+ Report
+ Typehint suggestions : added ticks to fully typed methods
+ Emissary : Extract more information from dump.sqlite, instead of datastore.sqlite
+ Ambassador : Added a list of parameters, defined in the application
+ Ambassador : Added a list of fossilised methods
+ Stubs : Added check around PHP native functions and CIT
+ StubsJson : Added property for PHP native structures
+ Analysis
+ New analysis : Report insufficient initialisation for array_merge() collector variable
+ New analysis : Report useless triple equals
+ New analysis : Don't compare typed boolean return values
+ New analysis : Report wrong type used with PHP functions
+ New analysis : Suggest abstracting away some PHP native functions
+ New analysis : Report try block that are too large
+ New analysis : Report variables potentially undefined in catch clause
+ New analysis : Report swapped arguments in methods overwriting
+ Upgraded analysis : InvalidPackFormat speed up
+ Upgraded analysis : Added parameter to Security/ShouldUsePreparedStatement to choose the preparing method
+ Upgraded analysis : Added parameter to Security/HardcodedPasswords to choose the name of properties/index
+ Upgraded analysis : PHP 8.0 new scalar typehint, stringable interface
+ Tokenizer
+ Added support for named parameters (PHP 8.0)
+ Trimmed some properties from atoms
+ Removed non-existent atom mentions
+ Added support for Attributes (WIP)
+ Added support for ?->
+ Added support for new T_*_NAME tokens
Version 2.1.4 (Marshal of Heavenly Blessing, 2020-07-23)
+ Architecture
+ Added time of last commit in audit results
+ Added more typehints
+ Upgraded PHP native method description with typehints (WIP)
+ Report
+ Typehint suggestion report
+ New toplogies : call order,
+ Ambassador : new statistics for typehint usage
+ Analysis
+ New analysis : Report double assignation of objects
+ New analysis : Typehints/CouldBe*, which makes suggestions for typehints
+ New analysis : Checks for argument type when typehint is present in custom methods
+ Upgraded analysis : Too Many Finds may be configured for threshold and prefix/suffix
+ Upgraded analysis : Typehints stats were extended to properties and multiple typehints
+ Upgraded analysis : Global outside Loop is extended to static variable too
+ Upgraded analysis : ErrorMessages also detect local variable contents
+ Upgraded analysis : Speed up for NullBoolean, Interfaces IsNotImplemented, InvalidPackFormat, arrayIndex, noWeakCrypto
+ Checked unit tests : 3532 / 3496 test pass (99% pass)
+ Tokenizer
+ Removed 'aliased' property in atoms
+ Fixed spotting of PHP native constants, when in Define() structure
+ Fixed loading of false values
+ Added support for the trailing comma in closure's use expression
+ more handling of phpdocs
+ Null is now reused when it is a default value, as a typehint.
+ Logical was split in two : Logical and Bitoperation
+ Added support for match() {} expression
+ Fixed boolean calculations during Load
+ Removed auto-referencing in DEFAULT calculations
Version 2.1.3 (Marshal of the Heavenly Canopy, 2020-07-02)
+ Architecture
+ Removed all usage of datastore in Reports, and only rely on dump.
+ ignore_rules is now case insensitive
+ Moved some of the loading to a separate gremlin call to reduce the size of node load.
+ Fixed the branch option with Git calls.
+ Storing trait's use expresion's options.
+ Report
+ Ambassador ; New inventory : PHP protocol used (php, phar, glob://...)
+ Stubs and StubsJson, have been tested extensively
+ Analysis
+ New analysis : report double assignations of the same object ($a = $b = new C)
+ New analysis : report cyclic references
+ Upgraded analysis : Used Constants edge situations
+ Upgraded analysis : No real comparison : extended analysis to constants
+ Upgraded analysis : extended detection of dynamic method calls to call_user_func*
+ Upgraded analysis : paths are detected with new functions
+ Checked unit tests : 3490 / 3520 test pass (99% pass)
+ Tokenizer
+ More phpdoc support (from code to report)
+ Added isPHP to absolute FQN notations
Version 2.1.2 (Mountain Deity, 2020-06-25)
+ Architecture
+ Removed files task from initproject.
+ Added ignore_rule directive, to ignore specific rules while running a specific report
+ More documentation (in particular, modifications section)
+ Exakat avoids to return twice the same results (file and line)
+ Sped up some analysis, and added a time limit per analysis
+ Removed double linking for static variables
+ Report
+ New reports ; Stubs and StubsJson, which produce the stubs of the audited code (PHP and JSON format) (WIP)
+ New report ; Typehint suggestion (WIP)
+ Ambassador ; offers the configuration for all the rules that spotted issues in the current audit, for reuse in other codes
+ Collect the number of property per class
+ Analysis
+ New analysis : Report methods that are too much indented on average
+ New analysis : Report possible confusion between a class and an alias
+ New analysis : Report variables that are static and global at the same time
+ New analysis : Report statement with long blocks
+ New analysis : Report phpdoc's deprecated methods and function calls
+ Upgraded analysis : Dereferencing levels now include () and =
+ Upgraded analysis : Unused Methods now skips classes that calls themselves dynamically
+ Upgraded analysis : No Need Get_class() was refactored
+ Upgraded analysis : Avoid Optional Properties was refactored
+ Upgraded analysis : Variable inconsistent Usage was extended with more reach
+ Upgraded analysis : Indirect Injections was upgraded with better reach with variables
+ Upgraded analysis : Direct Injections was upgraded with include
+ Upgraded analysis : PHP 8.0 new scalar typehint, stringable interface
+ Upgraded analysis : Mismatch Type and default now avoids undefined constants
+ Upgraded analysis : Wrong Optional Parameter is upgraded for PHP 8.0
+ Upgraded analysis : Indentation level was refactored
+ Checked unit tests : 3480 / 3510 test pass (99% pass)
+ Tokenizer
+ Upgraded detection of PHP native constants, when they are in absolute notation
+ Dump task stores use expressions' options, plus minor fixes
+ Added support for Attributes (PHP 8.0)
+ Added support for Union types (PHP 8.0)
+ AtomIs step (WITH_VARIABLE) was extended with local variables
+ DEFAULT doesn't point anymore on auto-updated values
+ Extended support for phpdoc in the code
+ Added support for promoted properties (PHP 8.0)
Version 2.1.1 (Earth Deity, 2020-06-01)
+ Architecture
+ Using timeLimit() to prevent Gremlin from running too deep in the rabbit hole
+ Added Neo4j Graphson V3 Graph driver
+ Moved 'Dump' rules to a specific Ruleset for easier administration
+ Propagated the upgrade to PHP 8.0 union types to three more rules
+ Fixed access to the list of ignored files
+ Added support for explicit stub files
+ Fixed multiple calls to Dump (better reentrant)
+ Report
+ New report : Meters, which holds measures for the audited code.
+ Ambassador : inventory of OpenSSL ciphers
+ Analysis
+ New analysis : Report unused traits
+ New analysis : Report chmod 777 system calls
+ New analysis : Check for keylength when generated by PHP
+ New analysis : Report methods with prefix/suffix and expected typehint
+ New analysis : Mark classes when they call dynamically their own methods
+ New analysis : Check for constants hidden in variable names ${X} != $X;
+ New analysis : Throw will be an expression in PHP 8.0
+ Upgraded analysis : Dangling operator now checks for loops too
+ Upgraded analysis : 'Variables used once' now skips variable definitions
+ Upgraded analysis : 'Access Private' takes into account dynamic classes
+ Upgraded analysis : 'Could Centralize' now uses a custom threshold. Default is 8 usage of an expression to centralize.
+ Upgraded analysis : 'Return true/false' checks that they are alone in the blocks
+ Upgraded analysis : 'Unreachable code' checks on constants values before reporting the next expression
+ Upgraded analysis : 'Magic methods' are case insensitive
+ Upgraded analysis : 'No Hardcoded passwords' has new functions that require a password
+ Upgraded analysis : 'Unused methods' are omitted for dynamically called methods and overwritten methods
+ Upgraded analysis : Insufficient Property Typehint also works for untyped properties
+ Upgraded analysis : PHP 8.0 new scalar typehint, stringable interface
+ Checked unit tests : 3383 / 3444 test pass (98% pass)
+ Tokenizer
+ Arguments with null as default values, automatically are nullable
+ Intval is also an integer for logical operations
+ Default Values now omits recursives assignations
+ Fixed fullnspath for PHP short tags
+ Added link between new command and constructor of anonymous classes.
Version 2.1.0 (City God, 2020-05-13)
+ Architecture
+ results stored in HashResults are now testable
+ Moved all query methods to Query/DSL namespace, from Analyzer class
+ Report
+ New report : ClassReview, with focus on classes structures
+ New report : Typechecks, with focus on type hint usage
+ Ambassador : Added typehint stats section
+ Ambassador : fixed display of classes name in classes tree
+ Ambassador : some missing sections have been rehabilitated
+ Analysis
+ New analysis : Trailing comma in signature (PHP 8.0)
+ New analysis : Hidden nullable types
+ New analysis : Not implemented abstract methods
+ New analysis : Report confusion between variables and arguments with arrow functions
+ Upgraded analysis : No literal for reference was extended
+ Upgraded analysis : Add zero is extended to constants
+ Upgraded analysis : This is for classes is now valid with arrow functions
+ Upgraded analysis : Useless arguments takes also into account constants
+ Upgraded analysis : Wrong Type With Call supports variadic arguments
+ Upgraded analysis : Extension constants now support fully qualified names
+ Upgraded analysis : Bad Typehint relay is compatible with union types
+ Upgraded analysis : Multiple Identical Cases now handles constants too
+ Checked unit tests : 3437 / 3477 test pass (99% pass)
+ Tokenizer
+ Restored 'List' atom
+ Interface methods are now 'abstract' by default
+ Added 'array' typehint for variadic arguments
+ Distinguish between argument and local variable in fn functions
+ Removed nullable property
+ propagate calls now propagates closures and arrow functions
+ Added support for union types (PHP 8.0)
+ Check all error messages from php, not just the first ones
Version 2.0.9 (Jialan, 2020-04-30)
+ Architecture
+ Added option in TU for analysis that won't fill the result table.
+ Reduced the number of duplicate links in the graph
+ Upgraded tokens for PHP 8.0.
+ Analysis
+ New analysis : Don't collect void
+ New analysis : Wrongly inited properties
+ New analysis : Not inited properties
+ Upgraded analysis : PHP 8.0 removed functions
+ Upgraded analysis : Useless instructions also include global/static variables
+ Upgraded analysis : Bad Relay Function now works with return types and property types
+ Upgraded analysis : 'Scalar or object properties' are upgraded with static calls
+ Removed analysis : Classes and Arrays IsRead and IsModified. Use properties now.
+ Checked unit tests : 3347 / 3420 test pass (97% pass)
+ Tokenizer
+ Fixed edge case for xor, with intval
+ Refactored multiple calculation for cast values
+ Added support for links between constants and use expressions
+ Linked classes with calls, when using use expression
Version 2.0.8 (Ao Run, 2020-04-20)
+ Architecture
+ Added new information in dump.sqlite, to make report autonomous
+ Analysis
+ Upgraded analysis : Paths are also recognized with constants, and more functions
+ Upgraded analysis : Should Use single Quotes
+ Checked unit tests : 3328 / 3398 test pass (97% pass)
+ Tokenizer
+ Fixed detection of PHP constants
Version 2.0.7 (Ao Shun, 2020-04-14)
+ Architecture
+ Adopted strict_types
+ Removed ctype1 attribute
+ Moved linting into separate processes
+ Refactored analysis to export to dump via SQL
+ Added 'None' ruleset to Dump task
+ Report
+ Ambassador : Added Constant's order report
+ None : Added support for No report
+ Analysis
+ Upgraded analysis : Undefined class constants
+ Upgraded analysis : Undefined global constants
+ Upgraded analysis : Undefined property
+ Checked unit tests : 3347 / 3420 test pass (97% pass)
+ Tokenizer
+ Support PHP 8.0's tokens
+ Added support for multiple typehint in the engine
+ Fixed edge case for boolean type casting
Version 2.0.6 (Ao Qin, 2020-03-04)
+ Architecture
+ Refactored analysis types for first UT
+ Moving to PHP 7.4 by default
+ Report
+ Rector : added more coverage
+ All : better display of typed properties
+ Analysis
+ New analysis : Semantic names of arguments
+ New analysis : !$a == $b
+ New prototype : possibles interfaces
+ Upgraded analysis : Overwritten literals now skips .=
+ Upgraded analysis : Scalar or object handles return type
+ Checked unit tests : 3322 / 3420 test pass (97% pass)
Version 2.0.5 (Ao Guang, 2019-11-25)
+ Architecture
+ Fixed access to severity and timetofix from compiled extension
+ Report
+ Ambassador : Fixed links to documentation
+ Analysis
+ Upgraded analysis : Mismatched Type and Default now omit undefined constants
+ Checked unit tests : 3366 / 3402 test pass (99% pass)
Version 2.0.4 (Army Defeating Star of Heaven's Gate, 2019-11-18)
+ Architecture
+ Reducing Analyzer's class method count
+ Moving more collections to Dump/ and Complete/
+ Report
+ Rector : added more coverage
+ Ambassador : Skiped analysis are now reported, not with -1
+ Ambassador : Foreach favorites's graph is displayed
+ Ambassador : Visibility suggestion has full method names
+ Analysis
+ Upgraded analysis : Don't Mix ++ now skips $a[$b++]
+ Upgraded analysis : Type hint stats skips some return values
+ Checked unit tests : 3365 / 3401 test pass (99% pass)
Version 2.0.3 (Military Star of the North Pole, 2019-11-11)
+ Architecture
+ Added check on xdebug presence (nesting limit)
+ Moving more collections to Dump/
+ Analysis
+ New analysis : Nullable typehint requires a test on NULL
+ New analysis : Typehint that requires too much
+ Upgraded analysis : Printf check on arguments works with '.'
+ Upgraded analysis : No magic for arrays skips __get()
+ Upgraded analysis : Const recommended, but not when methods are used
+ Upgraded analysis : Written only variables handles compact()
+ Upgraded analysis : Callbacks need returns, but not for spl_autoload_register()
+ Upgraded analysis : Extended analysis to Concatenation an Heredoc for Email
+ Upgraded analysis : Disconnected classes handles case sensitivity
+ Checked unit tests : 3371 / 3397 test pass (99% pass)
Version 2.0.2 (Danyuan Star of Honesty and Chasity, 2019-11-04)
+ Architecture
+ Adding more typehint
+ Created new class to build Dot files
+ Cleaned double examples
+ Dump handles multiple definitions for constants, class, trait, functions.
+ Report
+ Added new Topology report
+ Added new Type hint topology sort
+ Stubs : added class constant visibility
+ Analysis
+ New analysis : Report argument whose name clashes with typehint
+ New analysis : Report properties that are insufficiently typed
+ Moved 'Inclusions' to Dump/
+ Added steps to find original and relayed arguments
+ Tokenizer
+ Fixed paralellisation bug in Load
Version 2.0.1 (Military Star of the North Pole, 2019-10-28)
+ Architecture
+ Added more return type
+ Centralized reading for ini or json
+ Report
+ Ambassador: fixed Foreach favorites
+ Ambassador: added sort to number of parameter list
+ Checked unit tests : 3345 / 3377 test pass (99% pass)
+ Analysis
+ Upgraded xmlwriter to json
Version 2.0.0 (Civil Star of Mystery and Darkness, 2019-10-21)
+ Architecture
+ Manual file/line fixes
+ More simplifcations in load step
+ Report
+ Ambassador : fixed performance display
+ Ambassador : report list of shell commands
+ Typehint4all : first report
+ Perfile : fixed sorting
+ Analysis
+ New analysis : Report possible typehint for bool, int, string, array. WIP
+ Upgraded analysis : common alternatives are extended to switch and elsif
+ Upgraded analysis : xmlreader description includes class constants, properties and methods.
+ Upgraded analysis : callback needs return, is extended to php native functions
+ Checked unit tests : 3345 / 3377 test pass (99% pass)
Version 1.9.9 (Lasting Prosperity Star of True Man, 2019-10-14)
+ Architecture
+ Documentation review
+ Report
+ New reports : Stubs, Rector
+ Typehint stats
+ Stubs takes into account use expression
+ Added Concrete5 and Typo3 as vendors
+ Analysis
+ New analysis : checks on is_a third argument
+ New analysis : Invalid mbstring encodings
+ New analysis : Weird Index in arrays
+ New analysis : Avoid FILTER_SANITIZE_MAGIC_QUOTES
+ New analysis : Don't forget third argument
+ New analysis : Hard to update methods
+ New analysis : Merge two ifthen into one
+ New analysis : Report wrong type with calls
+ New analysis : Check case for namespaces
+ Updated analysis : Undefined interfaces now includes interfaces extensions
+ Updated analysis : Report more wrong types with return type
+ Updated analysis : Register globals also applied to class
+ Updated analysis : Could Use Try covers more new, functions and static calls
+ Updated analysis : Useless Cast also reports (string) array (always Array)
+ Checked unit tests : 3343 / 3366 test pass (99% pass)
+ Tokenizer
+ Create default values for foreach
+ Load captures empty files, and omit them
+ Create default values also handles ??=
Version 1.9.8 (Giant Gate Star of Dark Essence, 2019-10-07)
+ Architecture
+ Upgraded dump command to handle multiple -P
+ .yaml configuration handles multiple reports
+ Started journey to strict_types
+ Code cleaning
+ Report
+ Ambassador : Fixed report of Flexible Docs
+ Ambassador : trimmed delimiters in inventories
+ Inventory : Foreach, with key values
+ Analysis
+ New analysis : Wrong case for functions
+ New analysis : Parameter Hiding
+ New analysis : Report usage of Traversable
+ Updated analysis : Undeclared properties skips undefined properties
+ Updated analysis : Useless Interface, modernized query
+ Updated analysis : String Holding Variables now skips default, const, sprintf
+ Updated analysis : Binaries are not confused with hex
+ Updated analysis : Extended 'Insufficient typehint' to abstract classes
+ Checked unit tests : 3324 / 3343 test pass (99% pass)
+ Tokenizer
+ Fixed handling of large powers
+ Added more escaping when storing to SQLITE
Version 1.9.7 (Greedy Wolf Star of Sunlight, 2019-09-30)
+ Architecture
+ Added support for analysis reporting missing values in a reference list
+ Fixe batch dumping of results
+ Report
+ Ambassador : new inventory : dereferencing levels
+ Analysis
+ New analysis : Use PHP Native URL parsing functions
+ New analysis : Maximum dereferencing level
+ New analysis : Use case value in a switch : it was already tested
+ Updated analysis : No class as typehint accepts abstract classes
+ Updated analysis : Create Magic Property reachs out to traits
+ Updated analysis : Security also reports usage of unserialize()
+ Updated analysis : Mistmatched default argument also covers methods
+ Updated analysis : Never used parameter also covers methods
+ Updated analysis : Unused global also cover static variables
+ Updated analysis : Duplicate strings threshold is not 15, not 5.
+ Checked unit tests : 3289 / 3319 test pass (99% pass)
+ Tokenizer
+ RETURNTYPE, TYPEHINT, and DEFAUT are not always on, with Void atom, or better.
+ DEFAULT value targets end-values, skips ??, ?:, () and =.
+ Exceptions now reports errors in the Query, not where it is thrown
Version 1.9.6 (Star of Birth, 2019-09-23)
+ Architecture
+ Moved new elements to Complete/
+ Moved new elements to Dump/
+ Initial configuration of project now includes analysis parameters with default
+ Added descriptions to Rulesets
+ New command Config : displays current configuration for reuse and editing
+ Upgraded Doctor : support for docker-php, in-code
+ Report
+ Ambassador : removed {} on magic property inventory
+ Ambassador : new inventory of network protocols used (udp://, ssh2://...)
+ Analysis
+ New analysis : avoid mb_string inside loops
+ New analysis : avoid SSLvx and TLSv1.0
+ New analysis : report duplicate literal in the code, with parameter
+ New analysis : warn about null property
+ New coverage : calls to __call and __callStatic
+ Updated coverage : expressions with parenthesis
+ Updated coverage : default values are now targeting the final value in multiple assignations.
+ Updated analysis : Strange Variable name skips Staticdefinition and its default value
+ Updated analysis : Useless instructions are upgrade with pure functions
+ Updated analysis : Extended Closure2string with Arrowfunctions
+ Updated analysis : Extended 'Could be local variable' to traits
+ Updated analysis : Unused Global also covers static variables
+ Checked unit tests : 3279 / 3304 test pass (99% pass)
+ Tokenizer
+ Updated tokens for PHP 7.4
Version 1.9.5 (Star of Adversity, 2019-09-16)
+ Architecture
+ Added count property to Analysis node, stepstone for Diff analysis
+ Added support for 'optional' step
+ Added support for 'interfaces' as typehint for remote definitions
+ Removed more true/false values
+ Fixed strtolower with mb_strtolower in Dump
+ Report
+ Added several PHP error messages
+ Ambassador : added inventory of magic properties
+ Ambassador : added inventory of typehints for methods (WIP)
+ Added support for function/closure/argument arguments
+ Added support for function/closure/argument arguments
+ Analysis
+ New analysis : No literal value as referenced argument
+ New analysis : use array_slice or array_splice
+ New analysis : Useless typechecks with Typehint
+ New analysis : Report non-implemented interfaces
+ New analysis : Incompatible Signatures with Self (PHP 7.4+)
+ New analysis : Report wrong expectations from interfaces
+ Upgraded analysis : Excluded __construct and __destruct from Magic Methods
+ Upgraded analysis : Concat and Addition : Now also for bitshift
+ Upgraded analysis : Incompatible Signatures with Self (PHP 7.3)
+ Upgraded analysis : Elseif and Sequences are omitted in Level analysis
+ Tokenizer
+ Upgraded support for magic properties
Version 1.9.4 (Star of Benefit, 2019-09-09)
+ Architecture
+ Dump avoid storing multiple definition for the same class
+ Added more native return definitions
+ Adding UT for Complete/
+ Dump inventories are being moved to analysis class
+ Moving more Themes => rulesets
+ Report
+ Ambassador : Fixed several internal links
+ Ambassador : Displays the levels of nesting in the code
+ Ambassador : Upgraded compatibility report with PHP 7.4
+ New report : Stubs
+ Analysis
+ New analysis : PHP 7.4 New Directives
+ New analysis : Too many dimensions with array
+ New analysis : Check concat and coalesce precedence
+ New analysis : Adopt explode() third argument
+ New analysis : Ternary and useless assignation
+ New analysis : Nested ternary without parenthesis
+ New analysis : Spread operator with arrays
+ New analysis : Max level of indentation
+ New analysis : Use Arrowfunctions
+ Upgraded analysis : Clone with non object handles containers
+ Upgraded analysis : Calling non-static methods statically
+ Upgraded analysis : Unresolved Instanceof
+ Upgraded analysis : Array_merge and variadic, extended to isset
+ Checked unit tests : 3234 / 3259 test pass (99% pass)
+ Tokenizer
+ Last element of list() is not omitted anymore
Version 1.9.3 (Star of Longevity, 2019-09-02)
+ Architecture
+ Created new Complete category, with data complement for analysis
+ Refactored constant propagation
+ Made code compatible with PHP 7.4
+ Rename project_themas to project_rulesets
+ Added support of -p with .exakat.yaml
+ Report
+ Ambassador : reworked presentation for visibility suggestions
+ Analysis
+ New analysis : report covariance and contravariance for compatibility
+ New analysis : no spread operator for hash values
+ New analysis : self-closing tags are omitted by strip_tags
+ New analysis : report Openssl_random_pseudo_byte second argument usage
+ New analysis : CURLPIPE_HTTP1 is obsolete
+ New analysis : removed PHP 7.4 directives
+ New analysis : do not use ... with array_merge without checks
+ Updated analysis : added crc32c as hash algorithm
+ Removed analysis : Removed Curly Arrays (double take)
+ Checked unit tests : 3219 / 3240 test pass (99% pass)
+ Tokenizer
+ Extended OVERWRITE to Interfaces
+ Extended support for class_alias()
Version 1.9.2 (Star of Prosperity, 2019-08-26)
+ Architecture
+ Introduced a new set of analysis : Complete
+ Cleaned code for PHP 7.4 usage
+ Refactored Query to skip impossible Gremlin calls
+ Now using Project for project names
+ Report
+ New report : classes dependencies (HTML version)
+ New report : files dependencies (HTML and DOT version)
+ Ambassador : datas -> data
+ Analysis
+ New analysis : {} are deprecated in PHP 7.4
+ New analysis : Don't use ENT_IGNORE
+ New analysis : fn is a PHP 7.4 keyword
+ Updated analysis : Functions/UseConstantAsArguments covers also password_hash()
+ Updated analysis : printf arguments now handles positional formatters
+ Checked unit tests : 3172 / 3199 test pass (99% pass)
+ Tokenizer
+ Fixed precedence for left associativity
Version 1.9.1 (Star of Life, 2019-08-19)
+ Architecture
+ Fixed zip as code source
+ Report
+ Ambassador : Fixed issues list for Favorites
+ Owasp : switched dashboards
+ Analysis
+ Updated analysis : Loop Calling got one extra check
+ Checked unit tests : 3148 / 3187 test pass (99% pass)
Version 1.9.0 (Ming Wenzhang of Jiayin, 2019-07-29)
+ Architecture
+ Added missing configuration file for tinkergraph 3.4
+ Upgraded support for running exakat with PHP 7.4
+ Analysis
+ New analysis : array_key_exists() now report object usage
+ New analysis : report mb_strrpos 4th argument
+ New analysis : Reflection export are deprecated
+ New analysis : Report classes without parents but with 'parent'
+ New analysis : Don't use scalar as arrays
+ New analysis : Report use of PHP 7.4 serialize method
+ Updated analysis : Multiple Identical Keys checks for undefined keys first
+ Updated analysis : Dont be too manual : extended to catch clauses
+ Updated analysis : setcookie detection anchors the keyword at the beginning of the string
+ Updated analysis : Failed Substr comparison now works with constants
+ Updated analysis : Added support for continue 2 and 3
+ Checked unit tests : 3147 / 3186 test pass (99% pass)
+ Tokenizer
+ Added support for __serialize and __unserialize
+ Added support for numeric literal separator
+ Skip entirely unparsable files
Version 1.8.9 (Meng Feiqing of Jiachen, 2019-07-22)
+ Architecture
+ Check on graphdb configuration : default to nogremlin
+ Added support for baseline for project and report
+ Moved more doc to ruleset
+ Check on .git folder for update
+ Added -version option for upgrade command
+ Doctor honors .exakat.yml file
+ Analysis
+ New analysis : Report useless type of checks
+ New analysis : Disconnected classes
+ New analysis : Avoid using mb_detect_encoding()
+ New analysis : Check that source and blind variables are different in foreach
+ New analysis : ~ or ! favorite
+ Updated analysis : Is Zero omits multiplications
+ Updated analysis : Used Private Property is upgraded
+ Updated analysis : Multiple Identical Keys : refactored
+ Updated analysis : Undefined variables now skips extract, include, eval
+ Checked unit tests : 3147 / 3166 test pass (99% pass)
+ Tokenizer
+ Refactored support for Foreach : each blind variable is in VALUE
+ Upgraded precedence for ! (not)
+ Propagate constants with assignations
+ Fixed link to $this inside heredoc and co
+ Fixed an edgecase where Static method call was confused with Newcall
Version 1.8.8 (Wei Yuqing of Jiawu, 2019-07-15)
+ Architecture
+ Modernized tinkergraph support
+ When pcntl is available, stubs are produced in a child process
+ Removed duplicated methods
+ Exported sequences to helpers
+ More UT libraries are supported
+ Federated BUSYTIMEOUT in constant
+ Report
+ Ambassador and all dependend reports were refactored : menu is configurable with Yaml
+ Emissary is the upcoming configurable report.
+ Analysis
+ New step : Load data from code
+ New analysis : Variables used for setting aside value temporarily
+ New analysis : Use PHP array_ functions, instead of loops
+ Updated analysis : Unused methods now skips methods from PHP native interfaces (Arrayaccess)
+ Updated analysis : No class for typehint is now omitting PHP and extensions classes
+ Updated analysis : Switch to Switch applies to comparisons now
+ Updated analysis : Close namingg was sped up significantly
+ Updated analysis : array_column() suggestion was refined
+ Updated analysis : Htmlentities parameters also support some parenthesis usage
+ Updated analysis : Constant Scalar Expression only target specified expressions
+ Updated analysis : Static Properties skip Virtual properties
+ Checked unit tests : 3131 / 3155 test pass (99% pass)
+ Tokenizer
+ Refactored support for Exit and Die
+ Added raw support for phpdoc
Version 1.8.7 (Hu Wenchang of Jiashen, 2019-07-08)
+ Architecture
+ Added bugs fixes up to 7.3.7
+ New factory method for the graph
+ Analysis
+ New analysis : Backward compatible check on generators (can't return)
+ New analysis : Report wrong return typehint
+ New analysis : Use DateTimeImmutable
+ New concept : Methods that throw errors
+ Updated analysis : Recursive functions disambiguate methods
+ Updated analysis : Refactored property/variable confusion
+ Updated analysis : Could typehint checks on type validations
+ Updated analysis : Variable used once check for abstract methods
+ Updated analysis : Array_merge in loops omits file_put_contents()
+ Updated analysis : Simple Regex covers all special sequences, and unicode sequences
+ Checked unit tests : 3131 / 3142 test pass (99% pass)
+ Tokenizer
+ Differentiated support for self and static in calls
+ Moved Symfony support to its extension
+ Reworked loading to make it parallels.
Version 1.8.6 (Wei Yuqing of Jiawu, 2019-07-01)
+ Architecture
+ Added support for Tinkegraph 3.4
+ Extended support for Dev
+ Renamed Themes to Ruleset (WIP)
+ Split several long running queries into smaller chunks
+ Cached files to memory, write them once only
+ Optimized sides queries : omitting them when possible
+ Added count of issues in Analyse node
+ Optimized loading by grouping by inV
+ More coverage for Arrowfunction
+ Report
+ Dump : collect PHP cyclomatic complexity
+ Analysis
+ New analysis : Dependant abstract classes
+ New analysis : Don't use Null or Boolean as an array
+ New analysis : Infinite recursion
+ Updated analysis : Raised levels
+ Updated analysis : Method signature must be compatible
+ Updated analysis : Access Private in Trait is OK
+ Updated analysis : Recursive function
+ Checked unit tests : 3099 / 3105 test pass (99% pass)
+ Tokenizer
+ Upgraded support for 'Modules'
Version 1.8.5 (Zhan Zijiang of Jiaxu, 2019-06-24)
+ Architecture
+ Fixed several bugs in the online documentation
+ Started removing analysis, replacing with analysis
+ Fixed path in docker PHP usage.
+ Report
+ Ambassador : Export full INI and YAML config to replicate audit
+ Analysis
+ New analysis : Unused class constants
+ New analysis : Could Use available Trait
+ New analysis : literal that Could Be Constant
+ Updated analysis : Access Private in Trait is OK
+ Updated analysis : multiple identical argument is extended to closures, methods
+ Updated analysis : ext/rdkafka
+ Updated analysis : No Hardcoded Hash is accelerated
+ Updated analysis : Extended printf() check to constants
+ Updated analysis : Optimized 'redefined method'
+ Updated analysis : Memoize Magic Call
+ Updated analysis : set_locale requires constants
+ Checked unit tests : 3099 / 3105 test pass (99% pass)
+ Tokenizer
+ Added missing isModified to Foreach keys
+ Class Method Definition handles old style constructor
+ strict_types don't yield a block
+ Added typed values for magic constants
+ Refactored new -> constructor link for Self, Static, parent
+ Added missing arguments count to Newcall
Version 1.8.4 (Wang Wenqing of Jiazi, 2019-06-17)
+ Architecture
+ Added support for PHP in docker images for compilation tests
+ First prototype for Gremlin in a specific docker image
+ Report
+ Ambassador : restored original URL
+ Replaced 'Complexity' => 'Time To Fix'
+ Replaced 'Receipt' => Ruleset
+ Analysis
+ New analysis : regex with arrays
+ New analysis : Complex property names
+ New analysis : array_key_exists speed up
+ New analysis : curl_version forbidden argument
+ New analysis : PHP 7.4 new functions, classes and constants
+ Fixed analysis : Long Variable
+ Updated analysis : printf() format check extended to constants
+ Updated analysis : Written only variables is extended to static and global
+ Updated analysis : refactored 'Make default'
+ Updated analysis : 'Wrong number of arguments' is extended to methods
+ Updated analysis : 'Use coalesce' checks for
+ Updated analysis : Refactored 'Nested ifthen' to have a parameter
+ Updated analysis : Extended 'Class Usage' to return typehint
+ Updated analysis : Sped up 'Used Classes'
+ Checked unit tests : 2993 / 3071 test pass (97% pass)
+ Tokenizer
+ Upgraded handling of declare with strict_types
+ Support for magic properties across classes and traits
+ Added support for parent with properties
+ Properties are handled with static and normal at the same time
+ Fixed virtualproperties with static keyword (self and parent are ok)
+ Added argument count for 'new A', without parenthesis
+ Restored old break behavior for PHP 5 and older.
Version 1.8.3 (Jade Man of Yang, 2019-06-10)
+ Architecture
+ Extension docs show version numbers
+ Manual uses internal links
+ Report
+ New report : SARB
+ Updated report : Ambassador list number of arguments in natural order
+ Analysis
+ New analysis : from substr() to trim()
+ New analysis : suggest making magic property a concrete one (2 ways)
+ New analysis : no array auto-append
+ Updated analysis : 'Scalar or object property' refactored
+ Updated analysis : 'Multiple identical keys' get a new check on intval, broadened to constants
+ Updated analysis : 'Indirect injection' accelerated
+ Updated analysis : 'Could be class constant' accelerated
+ Updated analysis : 'Never used property' refactored
+ Updated analysis : 'Modern empty' modernized and broadened
+ Updated analysis : 'Useless check' skips isset/empty as they may be useful
+ Updated analysis : 'Identical methoods' skips abstract methods
+ Updated analysis : 'No Count Zero' also uses sizeof(), skips switch()
+ Checked unit tests : 2993 / 3071 test pass (97% pass)
+ Tokenizer
+ Upgraded local definitions for properties to Load phase
+ Handle static keyword in closures
+ Moved 'Real' to 'Float'
+ Created 'Scalartypehint' atom
+ Fixed intval, boolval for \true and \false
Version 1.8.2 (Zhao Ziyu of Dingchou, 2019-06-03)
+ Architecture
+ Refactored 'Update' command, to VCS
+ Collect missing definitions counts
+ Report handles a list of analysis names
+ Analysis
+ New analysis : No Need To Get_Class
+ New analysis : Report identical inherited methods
+ New analysis : Function returning -1 in case of error
+ Updated analysis : TypeHint must be returned, doesn't apply to abstract methods or interface methods
+ Updated analysis : 'Could Use Interface' also checks for static and visibility
+ Updated analysis : 'Concat empty' skips variables
+ Checked unit tests : 3024 / 3048 test pass (99% pass)
+ Tokenizer
+ Created 'virtual' properties, for limiting children agglomerations
+ Fixed normalized code for use traits
+ Added DEFAULT to all variable definitions
+ Connect strings to class definitions
+ Handle variable in 'compact', when they are static
Version 1.8.1 (Zhang Wentong of Dinghai, 2019-05-27)
+ Architecture
+ Fixed Symlink destination
+ Added collecting classes children, traits and interfaces counts
+ Added support for constants and functions in modules
+ Added missing functions in data
+ Report
+ New report : exakatYaml, which help configuring exakat
+ New report : Yaml
+ New report : Top10
+ Updated report : Json, text and xml get 'fullcode'
+ Analysis
+ Updated analysis : Should use self is extended to parent classes
+ Updated analysis : Should use prepared statement now skips some SQL queries
+ Checked unit tests : 3024 / 3048 test pass (99% pass)
Version 1.8.0 (Zang Wengong of Dingyou, 2019-05-20)
+ Architecture
+ Added missing native PHP functions
+ Restored anchor for ignore_dirs[] configuration
+ Removed more MAX_LOOPING usage
+ Report
+ Ambassador : removed { & @ } artefacts from globals
+ Analysis
+ New analysis : Function returning -1 in case of error
+ New analysis : Report PHP 7.4 unpacking inside array
+ New analysis : Report PHP 7.4 new functions and fn
+ New analysis : Useless arguments
+ New analysis : Addition and concatenation precedence for PHP 7.4
+ New analysis : report concatenation of empty strings
+ New analysis : casting has precedence over ternary
+ New analysis : report already used traits
+ New analysis : report missing traits in use expression
+ Updated analysis : isset on whole arrays : extended analysis to Phpvariables
+ Updated analysis : SQLITE3 requires single quotes
+ Updated analysis : Dir then slash : extended to constants
+ Updated analysis : Variable Strange Name extended to strange types
+ Updated analysis : Possible interface's analysis is sped up
+ Checked unit tests : 3021 / 3045 test pass (99% pass)
+ Tokenizer
+ Fixed fullcode of Usetrait
+ Extended method definitions to traits
+ Extended fluent interface detection to parents
+ Fixed dump for visibility change
+ Handle method aliases in use expression (as)
+ Better noDelimiter for double quotes strings
Version 1.7.9 (Shi Shutong of Dingwei, 2019-05-13)
+ Architecture
+ Upgraded list of functions by extension : openssl, math, hrtime
+ Added global atom to track all globals
+ Rewrote several Dump queries with DSL
+ Added support for Notice in Phpexec
+ Added support for .exakat.ini and .exakat.yaml
+ Added support for arrow functions : fn =>
+ Added support for spread operator in arrays [...[1,2,3]]
+ Report
+ Inventories : added 'inclusions' and 'global variables'
+ Ambassador : added global variables
+ Analysis
+ New analysis : support for ext/ffi, uuid
+ Updated analysis : Nested Ternary handles parenthesis
+ Updated analysis : Static loops is extended to references and arrays
+ Updated analysis : Recursive function is extended to Magic methods and Closures
+ Checked unit tests : 3014 / 3019 test pass (99% pass)
+ Tokenizer
+ Moved 'is_in_ignored_dir' to a property
+ Cleaned getFullnspath() call in Load
+ Fixed latent bug on Function fullnspath
+ Heredoc and Nowdoc are reported as constant if needed
+ Isset() is not read
+ Ignore PHP notices when linting