Distinguish wanted from unwanted fall through instances

Compile with -Wimplicit-fallthrough; analyze the results.
Define macro to mark valid fall through constructs. Mark all of the good
 ones, and fix the bad.

Not available with all compilers - for those without the feature this commit
 does nothing.
pull/1818/head
George Baltz N3GB 2025-07-26 21:56:39 -04:00
rodzic a7c8c3fa9e
commit 6c372f981f
9 zmienionych plików z 43 dodań i 5 usunięć

Wyświetl plik

@ -73,6 +73,23 @@
#include <hamlib/riglist.h> #include <hamlib/riglist.h>
//#include <hamlib/config.h> //#include <hamlib/config.h>
/* Define macros for handling attributes, if the compiler implements them
* Should be available in c23-capable compilers, or c++11 ones
*/
// From ISO/IEC 9899:202y n3301 working draft
#ifndef __has_c_attribute
#define __has_c_attribute(x) 0
#endif
// Macro to mark fallthrough as OK
// Squelch warnings if -Wimplicit-fallthrough added to CFLAGS
#if __has_c_attribute(fallthrough)
#define HL_FALLTHROUGH [[fallthrough]];
#else
/* Fall back */
#define HL_FALLTHROUGH
#endif
/** /**
* \addtogroup rig * \addtogroup rig
* @{ * @{

Wyświetl plik

@ -3393,6 +3393,7 @@ int icom_set_vfo(RIG *rig, vfo_t vfo)
rig_debug(RIG_DEBUG_ERR, "%s: unknown vfo '%s'\n", __func__, rig_debug(RIG_DEBUG_ERR, "%s: unknown vfo '%s'\n", __func__,
rig_strvfo(rs->current_vfo)); rig_strvfo(rs->current_vfo));
} }
HL_FALLTHROUGH // Fall into outer default
default: default:
if (priv->x25cmdfails == 0 || priv_caps->x25x26_always) if (priv->x25cmdfails == 0 || priv_caps->x25x26_always)
@ -9111,12 +9112,14 @@ static int icom_parse_spectrum_frame(RIG *rig, size_t length,
case SCOPE_MODE_FIXED: case SCOPE_MODE_FIXED:
cache->spectrum_mode = RIG_SPECTRUM_MODE_FIXED; cache->spectrum_mode = RIG_SPECTRUM_MODE_FIXED;
HL_FALLTHROUGH
case SCOPE_MODE_SCROLL_C: case SCOPE_MODE_SCROLL_C:
if (cache->spectrum_mode == RIG_SPECTRUM_MODE_NONE) if (cache->spectrum_mode == RIG_SPECTRUM_MODE_NONE)
{ {
cache->spectrum_mode = RIG_SPECTRUM_MODE_CENTER_SCROLL; cache->spectrum_mode = RIG_SPECTRUM_MODE_CENTER_SCROLL;
} }
HL_FALLTHROUGH
case SCOPE_MODE_SCROLL_F: case SCOPE_MODE_SCROLL_F:
if (cache->spectrum_mode == RIG_SPECTRUM_MODE_NONE) if (cache->spectrum_mode == RIG_SPECTRUM_MODE_NONE)

Wyświetl plik

@ -5600,7 +5600,7 @@ int kenwood_send_morse(RIG *rig, vfo_t vfo, const char *msg)
SNPRINTF(morsebuf, sizeof morsebuf, "KY2%s", m2); SNPRINTF(morsebuf, sizeof morsebuf, "KY2%s", m2);
break; break;
} }
/* FALL THROUGH */ HL_FALLTHROUGH
default: default:
/* the command must consist of 28 bytes 0x20 padded */ /* the command must consist of 28 bytes 0x20 padded */

Wyświetl plik

@ -1298,6 +1298,7 @@ static int get_freq_and_mode(RIG *rig, vfo_t vfo, freq_t *freq, rmode_t *mode,
case MD_CWN: case MD_CWN:
*width = rig_passband_narrow(rig, RIG_MODE_CW); *width = rig_passband_narrow(rig, RIG_MODE_CW);
HL_FALLTHROUGH
case MD_CW: case MD_CW:
*mode = RIG_MODE_CW; *mode = RIG_MODE_CW;
@ -1305,6 +1306,7 @@ static int get_freq_and_mode(RIG *rig, vfo_t vfo, freq_t *freq, rmode_t *mode,
case MD_CWNR: case MD_CWNR:
*width = rig_passband_narrow(rig, RIG_MODE_CW); *width = rig_passband_narrow(rig, RIG_MODE_CW);
HL_FALLTHROUGH
case MD_CWR: case MD_CWR:
*mode = RIG_MODE_CWR; *mode = RIG_MODE_CWR;
@ -1312,6 +1314,7 @@ static int get_freq_and_mode(RIG *rig, vfo_t vfo, freq_t *freq, rmode_t *mode,
case MD_AMN: case MD_AMN:
*width = rig_passband_narrow(rig, RIG_MODE_AM); *width = rig_passband_narrow(rig, RIG_MODE_AM);
HL_FALLTHROUGH
case MD_AM: case MD_AM:
*mode = RIG_MODE_AM; *mode = RIG_MODE_AM;
@ -1319,6 +1322,7 @@ static int get_freq_and_mode(RIG *rig, vfo_t vfo, freq_t *freq, rmode_t *mode,
case MD_FMN: case MD_FMN:
*width = rig_passband_narrow(rig, RIG_MODE_FM); *width = rig_passband_narrow(rig, RIG_MODE_FM);
HL_FALLTHROUGH
case MD_FM: case MD_FM:
*mode = RIG_MODE_FM; *mode = RIG_MODE_FM;

Wyświetl plik

@ -794,6 +794,7 @@ static int ft920_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
{ {
return err; return err;
} }
HL_FALLTHROUGH
case RIG_VFO_MEM: /* MEM TUNE or user doesn't care */ case RIG_VFO_MEM: /* MEM TUNE or user doesn't care */
case RIG_VFO_MAIN: case RIG_VFO_MAIN:
@ -965,6 +966,7 @@ static int ft920_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
{ {
return err; return err;
} }
HL_FALLTHROUGH
case RIG_VFO_MEM: /* MEM TUNE or user doesn't care */ case RIG_VFO_MEM: /* MEM TUNE or user doesn't care */
case RIG_VFO_MAIN: case RIG_VFO_MAIN:

Wyświetl plik

@ -4414,9 +4414,9 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
case RIG_METER_VDD: SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), format, 5); case RIG_METER_VDD: SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), format, 5);
break; break;
default:
rig_debug(RIG_DEBUG_ERR, "%s: unknown val.i=%d\n", __func__, val.i); rig_debug(RIG_DEBUG_ERR, "%s: unknown val.i=%d\n", __func__, val.i);
RETURNFUNC(-RIG_EINVAL);
default: RETURNFUNC(-RIG_EINVAL);
} }
break; break;

Wyświetl plik

@ -408,8 +408,8 @@ int HAMLIB_API port_close(hamlib_port_t *p, rig_port_t port_type)
default: default:
rig_debug(RIG_DEBUG_ERR, "%s(): Unknown port type %d\n", rig_debug(RIG_DEBUG_ERR, "%s(): Unknown port type %d\n",
__func__, port_type); __func__, port_type);
HL_FALLTHROUGH
/* fall through */
case RIG_PORT_DEVICE: case RIG_PORT_DEVICE:
ret = close(p->fd); ret = close(p->fd);
} }

Wyświetl plik

@ -3611,8 +3611,8 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt)
{ {
ptt = RIG_PTT_ON; ptt = RIG_PTT_ON;
} }
HL_FALLTHROUGH
/* fall through */
case RIG_PTT_RIG_MICDATA: case RIG_PTT_RIG_MICDATA:
if (caps->set_ptt == NULL) if (caps->set_ptt == NULL)
{ {

Wyświetl plik

@ -412,15 +412,25 @@ do {
hashv += keylen; \ hashv += keylen; \
switch ( _hj_k ) { \ switch ( _hj_k ) { \
case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \ case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \
HL_FALLTHROUGH \
case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \ case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \
HL_FALLTHROUGH \
case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \ case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \
HL_FALLTHROUGH \
case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \ case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \
HL_FALLTHROUGH \
case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \ case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \
HL_FALLTHROUGH \
case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \ case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \
HL_FALLTHROUGH \
case 5: _hj_j += _hj_key[4]; \ case 5: _hj_j += _hj_key[4]; \
HL_FALLTHROUGH \
case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \ case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \
HL_FALLTHROUGH \
case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \ case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \
HL_FALLTHROUGH \
case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \ case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \
HL_FALLTHROUGH \
case 1: _hj_i += _hj_key[0]; \ case 1: _hj_i += _hj_key[0]; \
} \ } \
HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
@ -547,7 +557,9 @@ do { \
uint32_t _mur_k1=0; \ uint32_t _mur_k1=0; \
switch((keylen) & 3) { \ switch((keylen) & 3) { \
case 3: _mur_k1 ^= _mur_tail[2] << 16; \ case 3: _mur_k1 ^= _mur_tail[2] << 16; \
HL_FALLTHROUGH \
case 2: _mur_k1 ^= _mur_tail[1] << 8; \ case 2: _mur_k1 ^= _mur_tail[1] << 8; \
HL_FALLTHROUGH \
case 1: _mur_k1 ^= _mur_tail[0]; \ case 1: _mur_k1 ^= _mur_tail[0]; \
_mur_k1 *= _mur_c1; \ _mur_k1 *= _mur_c1; \
_mur_k1 = MUR_ROTL32(_mur_k1,15); \ _mur_k1 = MUR_ROTL32(_mur_k1,15); \