Hi,
this patch fixes all 27 flashrom source code issues reported by LLVM/clang's scan-build (r79326, new build on the way).
Temporary URL of the findings: http://coresystems.de/~stepan/flashrom-scanbuild/
Stefan
This patch cleans up flashrom so that it passes LLVM/clang's scan-build without warnings.
It also drops a completely unnecessary goto in ft2232_spi.c
Signed-off-by: Stefan Reinauer stepan@coresystems.de
Index: serprog.c =================================================================== --- serprog.c (revision 721) +++ serprog.c (working copy) @@ -95,7 +95,7 @@ whether the command is supported before doing it */ static int sp_check_avail_automatic = 0;
-static void sp_die(char *msg) +static void __attribute__((noreturn)) sp_die(char *msg) { perror(msg); exit(1); Index: sharplhf00l04.c =================================================================== --- sharplhf00l04.c (revision 721) +++ sharplhf00l04.c (working copy) @@ -73,7 +73,6 @@ uint8_t wait_lhf00l04(chipaddr bios) { uint8_t status; - uint8_t id1, id2;
chip_writeb(0x70, bios); if ((chip_readb(bios) & 0x80) == 0) { // it's busy @@ -82,13 +81,13 @@
status = chip_readb(bios);
- // put another command to get out of status register mode + // put another command to get out of status register mode.
chip_writeb(0x90, bios); programmer_delay(10);
- id1 = chip_readb(bios); - id2 = chip_readb(bios + 0x01); + chip_readb(bios); // vendor ID + chip_readb(bios + 0x01); // device ID
// this is needed to jam it out of "read id" mode chip_writeb(0xAA, bios + 0x5555); Index: ft2232_spi.c =================================================================== --- ft2232_spi.c (revision 721) +++ ft2232_spi.c (working copy) @@ -70,7 +70,6 @@ int f; struct ftdi_context *ftdic = &ftdic_context; unsigned char buf[512]; - unsigned char port_val = 0; char *portpos = NULL; int ft2232_type = FTDI_FT4232H; enum ftdi_interface ft2232_interface = INTERFACE_B; @@ -175,9 +174,8 @@ * dir: 0x0b CS=output, DI=input, DO=output, SK=output */ #define CS_BIT 0x08 - buf[0] = SET_BITS_LOW; - buf[1] = (port_val = CS_BIT); + buf[1] = CS_BIT; buf[2] = 0x0b; if (send_buf(ftdic, buf, 3)) return -1; @@ -195,7 +193,6 @@ { struct ftdi_context *ftdic = &ftdic_context; static unsigned char *buf = NULL; - unsigned char port_val = 0; int i, ret = 0;
if (writecnt > 65536 || readcnt > 65536) @@ -213,10 +210,11 @@ * as possible together. if we're not expecting to * read, we can assert CS, write, and deassert CS all * in one shot. if reading, we do three separate - * operations. */ + * operations. + */ printf_debug("Assert CS#\n"); buf[i++] = SET_BITS_LOW; - buf[i++] = (port_val &= ~CS_BIT); + buf[i++] = 0 & ~CS_BIT; /* assertive */ buf[i++] = 0x0b;
if (writecnt) { @@ -236,20 +234,19 @@ buf[i++] = ((readcnt - 1) >> 8) & 0xff; ret = send_buf(ftdic, buf, i); i = 0; - if (ret) goto deassert_cs; + if (ret == 0) { + /* FIXME: This is unreliable. There's no guarantee that we read + * the response directly after sending the read command. + * We may be scheduled out etc. + */ + ret = get_buf(ftdic, readarr, readcnt); + }
- /* FIXME: This is unreliable. There's no guarantee that we read - * the response directly after sending the read command. - * We may be scheduled out etc. - */ - ret = get_buf(ftdic, readarr, readcnt); - }
-deassert_cs: printf_debug("De-assert CS#\n"); buf[i++] = SET_BITS_LOW; - buf[i++] = (port_val |= CS_BIT); + buf[i++] = CS_BIT; buf[i++] = 0x0b; if (send_buf(ftdic, buf, i)) return -1; Index: sst28sf040.c =================================================================== --- sst28sf040.c (revision 721) +++ sst28sf040.c (working copy) @@ -30,28 +30,24 @@
static void protect_28sf040(chipaddr bios) { - uint8_t tmp; - - tmp = chip_readb(bios + 0x1823); - tmp = chip_readb(bios + 0x1820); - tmp = chip_readb(bios + 0x1822); - tmp = chip_readb(bios + 0x0418); - tmp = chip_readb(bios + 0x041B); - tmp = chip_readb(bios + 0x0419); - tmp = chip_readb(bios + 0x040A); + chip_readb(bios + 0x1823); + chip_readb(bios + 0x1820); + chip_readb(bios + 0x1822); + chip_readb(bios + 0x0418); + chip_readb(bios + 0x041B); + chip_readb(bios + 0x0419); + chip_readb(bios + 0x040A); }
static void unprotect_28sf040(chipaddr bios) { - uint8_t tmp; - - tmp = chip_readb(bios + 0x1823); - tmp = chip_readb(bios + 0x1820); - tmp = chip_readb(bios + 0x1822); - tmp = chip_readb(bios + 0x0418); - tmp = chip_readb(bios + 0x041B); - tmp = chip_readb(bios + 0x0419); - tmp = chip_readb(bios + 0x041A); + chip_readb(bios + 0x1823); + chip_readb(bios + 0x1820); + chip_readb(bios + 0x1822); + chip_readb(bios + 0x0418); + chip_readb(bios + 0x041B); + chip_readb(bios + 0x0419); + chip_readb(bios + 0x041A); }
static int erase_sector_28sf040(struct flashchip *flash, unsigned long address, int sector_size) Index: stm50flw0x0x.c =================================================================== --- stm50flw0x0x.c (revision 721) +++ stm50flw0x0x.c (working copy) @@ -54,19 +54,17 @@
static void wait_stm50flw0x0x(chipaddr bios) { - uint8_t id1; - // id2; - chip_writeb(0x70, bios); if ((chip_readb(bios) & 0x80) == 0) { // it's busy while ((chip_readb(bios) & 0x80) == 0) ; } + // put another command to get out of status register mode
chip_writeb(0x90, bios); programmer_delay(10);
- id1 = chip_readb(bios); + chip_readb(bios); // Read device ID (to make sure?)
// this is needed to jam it out of "read id" mode chip_writeb(0xAA, bios + 0x5555); Index: sb600spi.c =================================================================== --- sb600spi.c (revision 721) +++ sb600spi.c (working copy) @@ -64,6 +64,11 @@ printf("Programming flash"); for (i = 0; i < total_size; i++, buf++) { result = spi_byte_program(i, *buf); + if (result) { + // spi_byte_program reported the error for us already + printf_debug("... continuing anyway.\n"); + } + /* wait program complete. */ if (i % 0x8000 == 0) printf("."); Index: 82802ab.c =================================================================== --- 82802ab.c (revision 721) +++ 82802ab.c (working copy) @@ -30,16 +30,15 @@ #include <stdlib.h> #include "flash.h"
-// I need that Berkeley bit-map printer void print_82802ab_status(uint8_t status) { - printf("%s", status & 0x80 ? "Ready:" : "Busy:"); - printf("%s", status & 0x40 ? "BE SUSPEND:" : "BE RUN/FINISH:"); - printf("%s", status & 0x20 ? "BE ERROR:" : "BE OK:"); - printf("%s", status & 0x10 ? "PROG ERR:" : "PROG OK:"); - printf("%s", status & 0x8 ? "VP ERR:" : "VPP OK:"); - printf("%s", status & 0x4 ? "PROG SUSPEND:" : "PROG RUN/FINISH:"); - printf("%s", status & 0x2 ? "WP|TBL#|WP#,ABORT:" : "UNLOCK:"); + printf_debug("%s", status & 0x80 ? "Ready:" : "Busy:"); + printf_debug("%s", status & 0x40 ? "BE SUSPEND:" : "BE RUN/FINISH:"); + printf_debug("%s", status & 0x20 ? "BE ERROR:" : "BE OK:"); + printf_debug("%s", status & 0x10 ? "PROG ERR:" : "PROG OK:"); + printf_debug("%s", status & 0x8 ? "VP ERR:" : "VPP OK:"); + printf_debug("%s", status & 0x4 ? "PROG SUSPEND:" : "PROG RUN/FINISH:"); + printf_debug("%s", status & 0x2 ? "WP|TBL#|WP#,ABORT:" : "UNLOCK:"); }
int probe_82802ab(struct flashchip *flash) @@ -98,20 +97,19 @@
// clear status register chip_writeb(0x50, bios); - //printf("Erase at %p\n", bios); + // clear write protect - //printf("write protect is at %p\n", (wrprotect)); - //printf("write protect is 0x%x\n", *(wrprotect)); chip_writeb(0, wrprotect); - //printf("write protect is 0x%x\n", *(wrprotect));
// now start it chip_writeb(0x20, bios); chip_writeb(0xd0, bios); programmer_delay(10); + // now let's see what the register is status = wait_82802ab(flash->virtual_memory); - //print_82802ab_status(status); + print_82802ab_status(status); + if (check_erased_range(flash, offset, flash->page_size)) { fprintf(stderr, "ERASE FAILED!\n"); return -1;