mtd: rawnand: Replace zero-length array with flexible-array member
Subsystems (9)
PATCH 1/1 mtd: rawnand: Replace zero-length array with flexible-array member
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo {
int stuff;
struct boo array[];
};By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being inadvertently introduced[3] to the codebase from now on.
Also, notice that, dynamic memory allocations won't be affected by this change:
"Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero."[1]
This issue was found with the help of Coccinelle.
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")
--- drivers/mtd/nand/raw/denali.h | 2 +- drivers/mtd/nand/raw/marvell_nand.c | 2 +- drivers/mtd/nand/raw/meson_nand.c | 2 +- drivers/mtd/nand/raw/mtk_nand.c | 2 +- drivers/mtd/nand/raw/nand_hynix.c | 2 +- drivers/mtd/nand/raw/sunxi_nand.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-)
drivers/mtd/nand/raw/denali.h +1 -1
@@ -328,7 +328,7 @@ struct denali_chip {struct nand_chip chip;struct list_head node;unsigned int nsels; -struct denali_chip_sel sels[0 ]; +struct denali_chip_sel sels[]; };/**
drivers/mtd/nand/raw/marvell_nand.c +1 -1
@@ -334,7 +334,7 @@ struct marvell_nand_chip {int addr_cyc;int selected_die;unsigned int nsels; -struct marvell_nand_chip_sel sels[0 ]; +struct marvell_nand_chip_sel sels[]; };static inline struct marvell_nand_chip *to_marvell_nand (struct nand_chip *chip)
drivers/mtd/nand/raw/meson_nand.c +1 -1
@@ -118,7 +118,7 @@ struct meson_nfc_nand_chip {u8 *data_buf;__le64 *info_buf;u32 nsels; -u8 sels[0 ]; +u8 sels[]; };struct meson_nand_ecc {
drivers/mtd/nand/raw/mtk_nand.c +1 -1
@@ -131,7 +131,7 @@ struct mtk_nfc_nand_chip {u32 spare_per_sector;int nsels; -u8 sels[0 ]; +u8 sels[];/* nothing after this field */ };
drivers/mtd/nand/raw/nand_hynix.c +1 -1
@@ -26,7 +26,7 @@struct hynix_read_retry {int nregs;const u8 *regs; -u8 values[0 ]; +u8 values[]; };/**
drivers/mtd/nand/raw/sunxi_nand.c +1 -1
@@ -195,7 +195,7 @@ struct sunxi_nand_chip {u32 timing_cfg;u32 timing_ctl;int nsels; -struct sunxi_nand_chip_sel sels[0 ]; +struct sunxi_nand_chip_sel sels[]; };static inline struct sunxi_nand_chip *to_sunxi_nand (struct nand_chip *nand)
Signature · 1 line
2.25.0
Quoted 25 lines · Gustavo A. R. Silva
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo { int stuff; struct boo array[]; };By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being inadvertently introduced[3] to the codebase from now on.
Also, notice that, dynamic memory allocations won't be affected by this change:
"Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero."[1]
This issue was found with the help of Coccinelle.
Quoted 7 lines
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit76497732932f("cxgb3/l2t: Fix undefined behaviour")Signed-off-by Gustavo A. R. Silva <[email protected]>--- drivers/mtd/nand/raw/denali.h | 2 +-
Quoted 7 lines
drivers/mtd/nand/raw/marvell_nand.c | 2 +- drivers/mtd/nand/raw/meson_nand.c | 2 +- drivers/mtd/nand/raw/mtk_nand.c | 2 +- drivers/mtd/nand/raw/nand_hynix.c | 2 +- drivers/mtd/nand/raw/sunxi_nand.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-)
Signature · 2 lines
Best Regards Masahiro Yamada
Quoted 22 lines · Gustavo A. R. Silva
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo { int stuff; struct boo array[]; };By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being inadvertently introduced[3] to the codebase from now on.
Also, notice that, dynamic memory allocations won't be affected by this change:
"Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero."[1]
Quoted 8 lines
This issue was found with the help of Coccinelle.
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit76497732932f("cxgb3/l2t: Fix undefined behaviour")Signed-off-by Gustavo A. R. Silva <[email protected]>Acked-by Masahiro Yamada <[email protected]>
Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.
Miquel
Quoted 10 lines · Miquel Raynal
Quoted 7 lines
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit76497732932f("cxgb3/l2t: Fix undefined behaviour")Signed-off-by Gustavo A. R. Silva <[email protected]>Acked-by Masahiro Yamada <[email protected]>Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.
Thanks, Miquel.
--
Gustavo
This patch was applied to khilman/linux-amlogic.git (refs/heads/for-next).
Hello:
This patch was applied to khilman/linux-amlogic.git (refs/heads/for-next).
Quoted 11 lines · On Wed, 26 Feb 2020 16:27:22 -0600 you wrote:
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo { int stuff; struct boo array[]; };[...]
Here is a summary with links:
- mtd: rawnand: Replace zero-length array with flexible-array member
https://git.kernel.org/khilman/linux-amlogic/c/49f1c33076ca56871ffddc4800b04524204ea889
You are awesome, thank you!
Signature · 7 lines
Deet-doot-dot, I am a bot. https://korg.wiki.kernel.org/userdoc/pwbot _______________________________________________ linux-amlogic mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-amlogic