adlint 2.4.0 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ChangeLog CHANGED
@@ -1,3 +1,66 @@
1
+ Tue Oct 9 10:49:00 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
2
+
3
+ * release.ga : 2.4.6
4
+ - Fix bad controlling statement evaluation in order to manage value
5
+ domain of the controlling variable correctly.
6
+ - Fix bad argument type specification of `%s', `%p' and `%n'
7
+ conversion-specifiers of *printf standard functions in order to
8
+ detect W0635 correctly.
9
+
10
+ Fri Oct 5 16:54:09 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
11
+
12
+ * release.rc : 2.4.5
13
+ - Fix bad argument type specification of `%s', `%p' and `%n'
14
+ conversion-specifiers of *printf standard functions in order to
15
+ detect W0635 correctly.
16
+
17
+ Fri Oct 5 15:07:03 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
18
+
19
+ * features/code_check/W0635.feature : Add W0635 specification.
20
+ * MANIFEST : Ditto.
21
+
22
+ * lib/adlint/c/format.rb : Fix bad argument type specification of `%s',
23
+ `%p' and `%n' conversion-specifiers of *printf standard functions in
24
+ order to detect W0635 correctly.
25
+
26
+ Fri Oct 5 15:01:55 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
27
+
28
+ * spec/adlint/c/type_spec.rb : Add `==' and `convertible?' unit
29
+ specifications of QualifiedType.
30
+
31
+ * lib/adlint/c/type.rb : Fix bad type convertibility check of
32
+ cv-qualified types.
33
+
34
+ Fri Oct 5 11:11:56 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
35
+
36
+ * release.rc : 2.4.3
37
+ - Fix abend problem of iteration-statement evaluation.
38
+
39
+ Fri Oct 5 11:02:33 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
40
+
41
+ * lib/adlint/c/interp.rb : Fix abend problem of iteration-statement
42
+ evaluation.
43
+ * lib/adlint/c/branch.rb : Ditto.
44
+ * lib/adlint/c/option.rb : Ditto.
45
+
46
+ Thu Oct 4 18:11:13 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
47
+
48
+ * release.rc : 2.4.1
49
+ - Fix bad controlling statement evaluation in order to manage value
50
+ domain of the controlling variable correctly.
51
+
52
+ Thu Oct 4 17:56:03 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
53
+
54
+ * lib/adlint/c/syntax.rb : Add expression transformation in order to
55
+ correctly deduct controlling expression of an iteration-statement.
56
+ * lib/adlint/c/operator.rb : Ditto.
57
+
58
+ * lib/adlint/c/object.rb : Remove FrozenValue value wrapper.
59
+ * lib/adlint/c/ctrlexpr.rb : Ditto.
60
+
61
+ * lib/adlint/c/interp.rb : Fix bad controlling statement evaluation to
62
+ manage value domain of the controlling variable correctly.
63
+
1
64
  Fri Sep 21 15:00:34 2012 Yutaka Yanoh <yanoh@users.sourceforge.net>
2
65
 
3
66
  * release.ga : 2.4.0
data/MANIFEST CHANGED
@@ -197,6 +197,7 @@ features/code_check/W0483.feature
197
197
  features/code_check/W0573.feature
198
198
  features/code_check/W0583.feature
199
199
  features/code_check/W0606.feature
200
+ features/code_check/W0635.feature
200
201
  features/code_check/W0641.feature
201
202
  features/code_check/W0643.feature
202
203
  features/code_check/W0644.feature
data/NEWS CHANGED
@@ -21,6 +21,18 @@
21
21
 
22
22
  ++
23
23
 
24
+ === \AdLint 2.4.6 is released (2012-10-09)
25
+
26
+ * Fix bad controlling statement evaluation in order to manage value domain of
27
+ the controlling variable correctly
28
+ * Fix bad argument type specification of `%s', `%p' and `%n'
29
+ conversion-specifiers of *printf standard functions in order to detect W0635
30
+ correctly
31
+
32
+ See the file
33
+ {ChangeLog}[http://adlint.sourceforge.net/pmwiki/upload.d/Main/ChangeLog]
34
+ for more details.
35
+
24
36
  === \AdLint 2.4.0 is released (2012-09-21)
25
37
 
26
38
  ==== Changes since the 2.2.0 release
@@ -44,10 +56,6 @@
44
56
  * Fix #include directive evaluation in order to correctly read header file with
45
57
  an absolute path when any include_path items are not specified
46
58
 
47
- See the file
48
- {ChangeLog}[http://adlint.sourceforge.net/pmwiki/upload.d/Main/ChangeLog]
49
- for more details.
50
-
51
59
  === \AdLint 2.2.0 is released (2012-09-12)
52
60
 
53
61
  ==== Changes since the 2.0.10 release
@@ -49,7 +49,7 @@
49
49
  # - "ERR:X99"
50
50
  # format: "Your custom message for the error of E9999."
51
51
 
52
- version: "2.4.0"
52
+ version: "2.4.6"
53
53
 
54
54
  message_definition:
55
55
  W0001:
@@ -49,7 +49,7 @@
49
49
  # - "ERR:X99"
50
50
  # format: "Your custom message for the error of E9999."
51
51
 
52
- version: "2.4.0"
52
+ version: "2.4.6"
53
53
 
54
54
  message_definition:
55
55
  W0001:
@@ -49,7 +49,7 @@
49
49
  # - "ERR:X99"
50
50
  # format: "Your custom message for the error of E9999."
51
51
 
52
- version: "2.4.0"
52
+ version: "2.4.6"
53
53
 
54
54
  message_definition:
55
55
  X0001:
@@ -49,7 +49,7 @@
49
49
  # - "ERR:X99"
50
50
  # format: "Your custom message for the error of E9999."
51
51
 
52
- version: "2.4.0"
52
+ version: "2.4.6"
53
53
 
54
54
  message_definition:
55
55
  X0001:
@@ -0,0 +1,57 @@
1
+ Feature: W0635
2
+
3
+ W0635 detects that the argument type is not suitable for the corresponding
4
+ conversion-specifier.
5
+
6
+ Scenario: `%s' conversion-specifiers with various arguments
7
+ Given a target source named "fixture.c" with:
8
+ """
9
+ #include <stdio.h>
10
+
11
+ int main(void)
12
+ {
13
+ const char * const foo = "foo";
14
+ const unsigned char * const bar = "bar";
15
+ signed char *baz = "baz";
16
+ char * const qux = "qux";
17
+
18
+ return printf("%s %s %s %s", foo, bar, baz, qux); /* OK */
19
+ }
20
+ """
21
+ When I successfully run `adlint fixture.c` on noarch
22
+ Then the output should exactly match with:
23
+ | mesg | line | column |
24
+ | W9003 | 7 | 24 |
25
+ | W0100 | 7 | 18 |
26
+ | W0947 | 5 | 30 |
27
+ | W0947 | 6 | 39 |
28
+ | W0947 | 7 | 24 |
29
+ | W0947 | 8 | 24 |
30
+ | W0947 | 10 | 19 |
31
+
32
+
33
+ Scenario: `%s' conversion-specifiers with bad arguments
34
+ Given a target source named "fixture.c" with:
35
+ """
36
+ #include <stdio.h>
37
+
38
+ int main(void)
39
+ {
40
+ int foo = 0;
41
+ const int bar = 0;
42
+ const int * const baz = 0;
43
+
44
+ return printf("%s %s %s", foo, bar, baz); /* W0635 */
45
+ }
46
+ """
47
+ When I successfully run `adlint fixture.c` on noarch
48
+ Then the output should exactly match with:
49
+ | mesg | line | column |
50
+ | W9003 | 7 | 29 |
51
+ | W0635 | 9 | 19 |
52
+ | W0635 | 9 | 19 |
53
+ | W0635 | 9 | 19 |
54
+ | W0100 | 5 | 9 |
55
+ | W0947 | 9 | 19 |
56
+
57
+ # vim:ts=2:sw=2:sts=2:et:
@@ -389,6 +389,7 @@ Feature: W0644
389
389
  | W0118 | 1 | 13 |
390
390
  | W0117 | 3 | 5 |
391
391
  | W0644 | 5 | 11 |
392
+ | W0035 | 5 | 11 |
392
393
  | W0644 | 9 | 14 |
393
394
  | W0035 | 9 | 14 |
394
395
  | W0104 | 3 | 13 |
@@ -420,6 +421,7 @@ Feature: W0644
420
421
  | W0118 | 1 | 13 |
421
422
  | W0117 | 3 | 5 |
422
423
  | W0644 | 5 | 15 |
424
+ | W0035 | 5 | 15 |
423
425
  | W0644 | 9 | 18 |
424
426
  | W0035 | 9 | 18 |
425
427
  | W1071 | 3 | 5 |
@@ -449,6 +451,7 @@ Feature: W0644
449
451
  | W0118 | 1 | 13 |
450
452
  | W0117 | 3 | 5 |
451
453
  | W0644 | 5 | 11 |
454
+ | W0035 | 5 | 11 |
452
455
  | W0644 | 9 | 14 |
453
456
  | W0035 | 9 | 14 |
454
457
  | W0104 | 3 | 13 |
@@ -480,6 +483,7 @@ Feature: W0644
480
483
  | W0118 | 1 | 13 |
481
484
  | W0117 | 3 | 5 |
482
485
  | W0644 | 5 | 15 |
486
+ | W0035 | 5 | 15 |
483
487
  | W0644 | 9 | 18 |
484
488
  | W0035 | 9 | 18 |
485
489
  | W1071 | 3 | 5 |
@@ -53,8 +53,8 @@ Feature: W1071
53
53
  Then the output should exactly match with:
54
54
  | mesg | line | column |
55
55
  | W0117 | 1 | 6 |
56
- | W0613 | 3 | 12 |
57
56
  | W0610 | 3 | 12 |
57
+ | W0613 | 3 | 12 |
58
58
  | W0104 | 1 | 23 |
59
59
  | W9001 | 4 | 9 |
60
60
  | W0628 | 1 | 6 |
@@ -22,9 +22,9 @@ Feature: W1074
22
22
  Then the output should exactly match with:
23
23
  | mesg | line | column |
24
24
  | W1076 | 1 | 12 |
25
- | W0612 | 5 | 21 |
26
25
  | W0168 | 5 | 24 |
27
26
  | W0609 | 5 | 21 |
27
+ | W0612 | 5 | 21 |
28
28
  | W0629 | 1 | 12 |
29
29
  | W1074 | 5 | 15 |
30
30
  | W9001 | 9 | 9 |
@@ -49,10 +49,10 @@ Feature: W1074
49
49
  Then the output should exactly match with:
50
50
  | mesg | line | column |
51
51
  | W1076 | 1 | 12 |
52
- | W0613 | 5 | 33 |
53
52
  | W0168 | 5 | 16 |
54
53
  | W0168 | 5 | 36 |
55
54
  | W0610 | 5 | 33 |
55
+ | W0613 | 5 | 33 |
56
56
  | W0629 | 1 | 12 |
57
57
  | W1074 | 5 | 26 |
58
58
  | W9001 | 6 | 9 |
@@ -77,9 +77,9 @@ Feature: W1074
77
77
  Then the output should exactly match with:
78
78
  | mesg | line | column |
79
79
  | W1076 | 1 | 12 |
80
- | W0612 | 5 | 20 |
81
80
  | W0168 | 5 | 23 |
82
81
  | W0609 | 5 | 20 |
82
+ | W0612 | 5 | 20 |
83
83
  | W0629 | 1 | 12 |
84
84
  | W1074 | 5 | 17 |
85
85
  | W9001 | 9 | 9 |
@@ -105,9 +105,9 @@ Feature: W1074
105
105
  | mesg | line | column |
106
106
  | W0118 | 1 | 12 |
107
107
  | W1076 | 3 | 12 |
108
- | W0612 | 5 | 23 |
109
108
  | W0168 | 5 | 26 |
110
109
  | W0609 | 5 | 23 |
110
+ | W0612 | 5 | 23 |
111
111
  | W1073 | 5 | 19 |
112
112
  | W0629 | 3 | 12 |
113
113
  | W1074 | 5 | 15 |
@@ -135,9 +135,9 @@ Feature: W1074
135
135
  | W0118 | 1 | 12 |
136
136
  | W1077 | 1 | 12 |
137
137
  | W1076 | 3 | 12 |
138
- | W0612 | 5 | 22 |
139
138
  | W0168 | 5 | 25 |
140
139
  | W0609 | 5 | 22 |
140
+ | W0612 | 5 | 22 |
141
141
  | W0629 | 3 | 12 |
142
142
  | W9001 | 9 | 9 |
143
143
  | W0628 | 3 | 12 |
@@ -75,7 +75,7 @@ module C #:nodoc:
75
75
  end
76
76
 
77
77
  def implicit_condition?
78
- @options.include?(IMPLICIT_CONDITION)
78
+ @options.include?(IMPLICIT_COND)
79
79
  end
80
80
 
81
81
  def execute(interpreter, expression = nil, &block)
@@ -74,7 +74,7 @@ module C #:nodoc:
74
74
  def call(interpreter, funcall_expr, args)
75
75
  puts "__adlint__eval"
76
76
  char_array = interpreter.pointee_of(args.first.first)
77
- if char_array.type.array?
77
+ if char_array && char_array.type.array?
78
78
  without_nil = char_array.value.to_single_value.values[0..-2]
79
79
  program_text = without_nil.map { |char| char.unique_sample.chr }.join
80
80
  if program_text.empty?
@@ -47,6 +47,8 @@ module C #:nodoc:
47
47
  # +-> ValueDomainManipulator
48
48
  # | <-- ValueDomainNarrower
49
49
  # | <-- ValueDomainWidener
50
+ # | <-- WithoutExpressionValueDomainNarrower
51
+ # | <-- WithoutExpressionValueDomainWidener
50
52
  # |
51
53
  # +-> ValueDomainNarrowing
52
54
  # <-- ValueComparison
@@ -973,8 +975,8 @@ module C #:nodoc:
973
975
  super(named_variable)
974
976
 
975
977
  @base_variable = named_variable
976
- @phantom_value = phantom_value ?
977
- phantom_value : named_variable.memory.read_modifiable.dup
978
+ @phantom_value =
979
+ phantom_value ? phantom_value : named_variable.memory.read.dup
978
980
  end
979
981
 
980
982
  def value
@@ -1371,9 +1371,10 @@ module C #:nodoc:
1371
1371
  # or G conversion specifier.
1372
1372
  case length_modifier
1373
1373
  when "l"
1374
- [pointer_type(wchar_type)]
1374
+ [pointer_type(qualified_type(wchar_type, :const))]
1375
1375
  else
1376
- [pointer_type(signed_char_type), pointer_type(unsigned_char_type)]
1376
+ [pointer_type(qualified_type(signed_char_type, :const)),
1377
+ pointer_type(qualified_type(unsigned_char_type, :const))]
1377
1378
  end
1378
1379
  end
1379
1380
 
@@ -1410,7 +1411,7 @@ module C #:nodoc:
1410
1411
  if conversion_argument && conversion_argument.type.pointer?
1411
1412
  [conversion_argument.type.unqualify]
1412
1413
  else
1413
- [pointer_type(void_type)]
1414
+ [pointer_type(qualified_type(void_type, :const))]
1414
1415
  end
1415
1416
  end
1416
1417
 
@@ -1502,24 +1503,24 @@ module C #:nodoc:
1502
1503
  # specifier applies to a pointer to a ptrdiff_t argument.
1503
1504
  case length_modifier
1504
1505
  when "hh"
1505
- [pointer_type(signed_char_type)]
1506
+ [pointer_type(qualified_type(signed_char_type, :const))]
1506
1507
  when "h"
1507
- [pointer_type(signed_short_type)]
1508
+ [pointer_type(qualified_type(signed_short_type, :const))]
1508
1509
  when "l"
1509
- [pointer_type(signed_long_type)]
1510
+ [pointer_type(qualified_type(signed_long_type, :const))]
1510
1511
  when "ll"
1511
- [pointer_type(signed_long_long_type)]
1512
+ [pointer_type(qualified_type(signed_long_long_type, :const))]
1512
1513
  when "j"
1513
1514
  # FIXME: `intmax_t' is not supported yet.
1514
- [pointer_type(signed_long_long_type)]
1515
+ [pointer_type(qualified_type(signed_long_long_type, :const))]
1515
1516
  when "z"
1516
1517
  # FIXME: `size_t' is not supported yet.
1517
- [pointer_type(signed_long_type)]
1518
+ [pointer_type(qualified_type(signed_long_type, :const))]
1518
1519
  when "t"
1519
1520
  # FIXME: `ptrdiff_t' is not supported yet.
1520
- [pointer_type(signed_int_type)]
1521
+ [pointer_type(qualified_type(signed_int_type, :const))]
1521
1522
  else
1522
- [pointer_type(signed_int_type)]
1523
+ [pointer_type(qualified_type(signed_int_type, :const))]
1523
1524
  end
1524
1525
  end
1525
1526