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/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
* @{

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_strvfo(rs->current_vfo));
}
HL_FALLTHROUGH // Fall into outer default
default:
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:
cache->spectrum_mode = RIG_SPECTRUM_MODE_FIXED;
HL_FALLTHROUGH
case SCOPE_MODE_SCROLL_C:
if (cache->spectrum_mode == RIG_SPECTRUM_MODE_NONE)
{
cache->spectrum_mode = RIG_SPECTRUM_MODE_CENTER_SCROLL;
}
HL_FALLTHROUGH
case SCOPE_MODE_SCROLL_F:
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);
break;
}
/* FALL THROUGH */
HL_FALLTHROUGH
default:
/* 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:
*width = rig_passband_narrow(rig, RIG_MODE_CW);
HL_FALLTHROUGH
case MD_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:
*width = rig_passband_narrow(rig, RIG_MODE_CW);
HL_FALLTHROUGH
case MD_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:
*width = rig_passband_narrow(rig, RIG_MODE_AM);
HL_FALLTHROUGH
case MD_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:
*width = rig_passband_narrow(rig, RIG_MODE_FM);
HL_FALLTHROUGH
case MD_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;
}
HL_FALLTHROUGH
case RIG_VFO_MEM: /* MEM TUNE or user doesn't care */
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;
}
HL_FALLTHROUGH
case RIG_VFO_MEM: /* MEM TUNE or user doesn't care */
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);
break;
default:
rig_debug(RIG_DEBUG_ERR, "%s: unknown val.i=%d\n", __func__, val.i);
default: RETURNFUNC(-RIG_EINVAL);
RETURNFUNC(-RIG_EINVAL);
}
break;

Wyświetl plik

@ -408,8 +408,8 @@ int HAMLIB_API port_close(hamlib_port_t *p, rig_port_t port_type)
default:
rig_debug(RIG_DEBUG_ERR, "%s(): Unknown port type %d\n",
__func__, port_type);
HL_FALLTHROUGH
/* fall through */
case RIG_PORT_DEVICE:
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;
}
HL_FALLTHROUGH
/* fall through */
case RIG_PTT_RIG_MICDATA:
if (caps->set_ptt == NULL)
{

Wyświetl plik

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