Skip to contentSkip to conversation

Fix gcc4 warning, def & len may be used uninitialized

PATCH Mark Hollomon 2 participants 3 messages May 25, 2005 – May 26, 2005 Kernel janitors

lore
Share & tools
lore
#0 lore raw
Quoted 17 lines · Jesse Millan
fs/cifs/asn1.c renamed from fs/cifs/asn1.c~ +5 -1
@@ -160,12 +160,18 @@ asn1_length_decode(struct asn1_ctx *ctx,
 {
 	unsigned char ch, cnt;
 
-	if (!asn1_octet_decode(ctx, &ch))
+	if (!asn1_octet_decode(ctx, &ch)) {
+		/* Function would have returned without initializing 'def' and 'len' */
+		*def = 0;
+		*len = 0;
 		return 0;
+	}
 

fs/cifs/asn1.c asn1_length_decode(struct asn1_ctx *ctx, · line 177

Quoted 10 lines
fs/cifs/asn1.c renamed from fs/cifs/asn1.c~ +4 -2
-	if (ch = 0x80)
+	if (ch = 0x80) {
 		*def = 0;
-	else {
+		/* Function would have returned without initializing 'len' */
+		*len = 0;
+	} else {
 		*def = 1;
 
 		if (ch < 0x80)

Wouldn't it be better to just initialize def and len at the top of the function and be done? Or does that violate some kernel style preference?

Signature · 5 lines
Mark Hollomon
_______________________________________________
Kernel-janitors mailing list
[email protected]
http://lists.osdl.org/mailman/listinfo/kernel-janitors
#1 lore raw

Your right, it could go either way. Arnd Bergmann had posted earlier and said that it would be better to make the change in the function itself. I took that advice.

Quoted 36 lines · Mark Hollomon
Quoted 20 lines · Jesse Millan

--- linux-2.6.12-rc4/fs/cifs/asn1.c~ 2005-05-24 22:25:21.436866468
-0700
+++ linux-2.6.12-rc4/fs/cifs/asn1.c 2005-05-24 22:49:43.744939729
-0700

(quoted diff) +2 -1
@@ -160,12 +160,18 @@ asn1_length_decode(struct asn1_ctx *ctx,
 {
     unsigned char ch, cnt;
 
-    if (!asn1_octet_decode(ctx, &ch))
+    if (!asn1_octet_decode(ctx, &ch)) {
+        /* Function would have returned without initializing 'def'

and 'len' */

(quoted diff) +3 -0
+        *def = 0;
+        *len = 0;
         return 0;
+    }
 

Review

Quoted 10 lines
(quoted diff) +4 -2
-    if (ch = 0x80)
+    if (ch = 0x80) {
         *def = 0;
-    else {
+        /* Function would have returned without initializing 'len' */
+        *len = 0;
+    } else {
         *def = 1;
 
         if (ch < 0x80)

Wouldn't it be better to just initialize def and len at the top of the function and be done? Or does that violate some kernel style preference?

Signature · 12 lines
Jesse Millan
CNS Unix Team
Portland State University
Phone: (503) 725-9151
Mobile: (503) 453-0748
GPG key: www.system-calls.com/gpg.php

grep --recursive --ignore-case 'SHOULD WORK' /usr/src/linux/* | wc
_______________________________________________
Kernel-janitors mailing list
[email protected]
http://lists.osdl.org/mailman/listinfo/kernel-janitors
#2 lore raw
In reply to Mark Hollomon

From now on, Ill initialize the parameters at the top/start of the callee, unless it does not make sense to do so.

Thanks for the input.

Quoted 17 lines · Arnd Bergmann
Quoted 3 lines · Jesse Millan

Your right, it could go either way. Arnd Bergmann had posted earlier and said that it would be better to make the change in the function itself. I took that advice.

I think what Mark was suggesting is to initialize the parameters at the start of the inner function (asn1_length_decode), which makes perfect sense to me, at least in this particular case.

What you should not do is initialize it in the calling function, because then you defeat gcc's ability to warn you about real uninitialized uses of the local variables in that function.

	Arnd <><
Signature · 12 lines
Jesse Millan
CNS Unix Team
Portland State University
Phone: (503) 725-9151
Mobile: (503) 453-0748
GPG key: www.system-calls.com/gpg.php

grep --recursive --ignore-case 'SHOULD WORK' /usr/src/linux/* | wc
_______________________________________________
Kernel-janitors mailing list
[email protected]
http://lists.osdl.org/mailman/listinfo/kernel-janitors