如何解决C语言中“字节交换操作”引入的污染标量覆盖率问题

时间:2019-01-25 12:53:13

标签: c coverity

我正在使用C-覆盖率警告修复程序。 TAINTED_SCALAR警告的新增内容。 我在下面的代码中收到了污染的标量警告,

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {

    ConstraintLayout parent = (ConstraintLayout) holder.title.getParent();
    parent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context, "Clicked recycler view item at position " + position, Toast.LENGTH_SHORT).show();
        }
    });
}

我已经包含了for循环,以检查接收到的radiusPkt是否不为NULL,直到复制“ pktLen”字段值所需的长度为止。这是行不通的,而是引发了另一条警告,即死代码。在代码中对此进行了解释。

预计TAINTED_SCALAR警告为0。但是由于此问题,收到的TAINTED_SCALAR警告为1。

有人可以帮我摆脱这个TAINTED_SCALAR警告吗?

1 个答案:

答案 0 :(得分:0)

下面的代码更改解决了该问题并给出了预期的结果。

VOID func1 (UINT1 *p_u1RadiusReceivedPacket,
            UINT1 *p_u1Secret,
            UINT1 a_u1Concatenated[],
            INT4 *i4_Length)
{
    INT4                i4_seclen = 0;
    UINT2               u2_pktlen = 0;
    UINT1    a_u1RequestAuth[LEN_REQ_AUTH_AUTH] = {};
    INT4                        index = 0;

    if (p_u1RadiusReceivedPacket == NULL)
    {
        return;
    }

    MEMSET (a_u1Concatenated, 0, LEN_RX_PKT + LEN_SECRET);

    MEMCPY (&u2_pktlen, p_u1RadiusReceivedPacket + PKT_LEN, 2);

    u2_pktlen = OSIX_NTOHS (u2_pktlen);

    /* Validate the packet length to avoid buffer overflow, denial of service,
     * memory corruption, or other security vulnerability. */
    if ((u2_pktlen < 20) || (u2_pktlen > 4096))
    {
        return;
    }

    MEMCPY (a_u1Concatenated, p_u1RadiusReceivedPacket, u2_pktlen);
    MEMCPY (a_u1RequestAuth, p_u1RadiusReceivedPacket + PKT_REQA,
            LEN_REQ_AUTH_AUTH);
    MEMCPY (a_u1Concatenated + PKT_REQA,
            a_u1RequestAuth, LEN_REQ_AUTH_AUTH);
    i4_seclen = STRLEN ((char *) p_u1Secret);
    MEMCPY (a_u1Concatenated + u2_pktlen, p_u1Secret, i4_seclen);
    *i4_Length = u2_pktlen + i4_seclen;
}