From patchwork Sun Dec 24 07:35:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Di Chen X-Patchwork-Id: 82811 X-Patchwork-Delegate: amerey@redhat.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6C2483858284 for ; Sun, 24 Dec 2023 07:35:44 +0000 (GMT) X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id CE3763858D3C for ; Sun, 24 Dec 2023 07:35:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CE3763858D3C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CE3763858D3C Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703403335; cv=none; b=o69zmTTin8HGS6s7tLajsdXOc//yL+22aBvtcasis9ZwHJkZY8od/+hXd9m72VwExj4i7mRatXkskKaE7M5yG/PVdt67Qk7z6fNk1YYor3uKF7MOaH8JWESVWPC23vQNrk5N2PwVzPUsdVXAx8R9DpTKJO4NSxMsox2VCZ90oNI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703403335; c=relaxed/simple; bh=JapHzwj9YvRQ5s+OdUkFSpkTfZ3lJjNtlevQY2EyP+8=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=vGKzbm0pqy7fe7Is8drd3DSqBbDijC5aLsaLQpK4Hl9Tb3mY04MRI3lMZ7RXhvZg58gj0Bh2TDAjFeT4DMTVdhWUFipQncZysyrCU6iZ5HYc7TJipFwbmji8WQw6cW5jPtmmCEsbZQIlGZ+H1hGx5Ezs0hN4bRCEyKAXq5lj2PY= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1703403331; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=24BGc1BOO2Ss18K9ZciZDI3XZB37PGITHyLFFkDOobY=; b=FQBTAW0vCuMFiP9HwqED6XFPz8HDSQg5zPDayIgBGn8x15T0qknKHCSAHnulQt+3jO3bPo /xF8J+3b/GyoFYqbXqZlVuDH1DXWM1hQfBopyFs/jVQwYroSSZ+zKToSqsio2M2svzlIbx zGC1MHakUiJW90ZtJ3duRagVf7pkkFk= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-533-uS2qB6B6PRG1x59Gk2IN7A-1; Sun, 24 Dec 2023 02:35:28 -0500 X-MC-Unique: uS2qB6B6PRG1x59Gk2IN7A-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-40d44d9dae3so22215725e9.1 for ; Sat, 23 Dec 2023 23:35:28 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703403327; x=1704008127; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=feoPX/82pCtiL0Na0ZfMiRgQwUOt8vSPj7bwUTczHic=; b=WKohObkYW9IOeXQ88yk0nZHyLHYDpfsUHgcPnV3x48nY66+/G8EIPMqMrytvzHunc+ mJjR0B0c+a28358aPh4/42+imsJkEvoj2MSC57p9JXOoah8G8sLt9dKMGkx7W0TTNR9a b9GoigkS6peZdK5vs17b9GhNG1CZk0pOICUDaA4to7wywPHoj0TxYcidxK4XjCDNgqdp bGqo8nHueXy3sfBAv5Hf7XQfZP/5skAqW2BbGmrymZlP9TyxVKAHNLaPKLBV4fqq6X9C BjJe9nBMmNunysxuHISlwVl/Vq4/9wzGwH5MXbtYWyrptcla6omjf70h2Pj8BWDUTW5q imIQ== X-Gm-Message-State: AOJu0YzPS6Ov7AxvgUo837is5WjzryvGrnlsUcjWCnKPAnNJzOztL6ki 22oYlmiJwxeNA0RM5c8NpykfoV+BF79tNP8AlM9YaRWu1ZZDHiDHCkCns3w8e550hkpa/e4w0Uv zV5pgnOC8BQxNKZ7K8eEDh8cVdAOVL0emH1sHeGEhc4LGVvTECrnh/OEHFKDs X-Received: by 2002:a05:600c:5409:b0:40b:5e21:bddf with SMTP id he9-20020a05600c540900b0040b5e21bddfmr1824641wmb.110.1703403327057; Sat, 23 Dec 2023 23:35:27 -0800 (PST) X-Google-Smtp-Source: AGHT+IGdJUiDuxyKZiydn9XZJ7eVDA4QUefzGOgbC96KriDILOVLX5C/Y4Zj0oIEOPp+mebtsLeTTAB98Zsj/wiHCxA= X-Received: by 2002:a05:600c:5409:b0:40b:5e21:bddf with SMTP id he9-20020a05600c540900b0040b5e21bddfmr1824634wmb.110.1703403326487; Sat, 23 Dec 2023 23:35:26 -0800 (PST) MIME-Version: 1.0 From: Di Chen Date: Sun, 24 Dec 2023 15:35:15 +0800 Message-ID: Subject: [PATCH] libdwfl: Remove asserts from library code To: elfutils-devel@sourceware.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, HTML_MESSAGE, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org From 33d436aefb6b63a159943bd24eb432b8cfb8b369 Mon Sep 17 00:00:00 2001 From: Di Chen Date: Sun, 24 Dec 2023 11:44:48 +0800 Subject: [PATCH] libdwfl: Remove asserts from library code It would be better for elfutils library functions to return an error code instead of aborting because of a failed assert. This commit works on removing the asserts under libdwfl. There are two ways handling the removing: 1) Replace the asserts with if statements. 2) Replace the asserts with eu_static_assert. Asserts are heavily used across all elfutils libraries, and it's impossibe to implement the removing in one commit. So let's gradually remove the asserts in the later coming commits. https://sourceware.org/bugzilla/show_bug.cgi?id=31027 Signed-off-by: Di Chen --- libdwfl/dwfl_frame.c | 14 +++++++++----- libdwfl/dwfl_frame_pc.c | 3 ++- libdwfl/dwfl_frame_regs.c | 7 +++++-- libdwfl/dwfl_module_build_id.c | 3 ++- libdwfl/dwfl_module_getdwarf.c | 3 ++- libdwfl/dwfl_module_getsrc_file.c | 3 ++- libdwfl/dwfl_module_register_names.c | 3 ++- libdwfl/dwfl_segment_report_module.c | 2 +- 8 files changed, 25 insertions(+), 13 deletions(-) void *notes; if (ei_data == MY_ELFDATA From 33d436aefb6b63a159943bd24eb432b8cfb8b369 Mon Sep 17 00:00:00 2001 From: Di Chen Date: Sun, 24 Dec 2023 11:44:48 +0800 Subject: [PATCH] libdwfl: Remove asserts from library code It would be better for elfutils library functions to return an error code instead of aborting because of a failed assert. This commit works on removing the asserts under libdwfl. There are two ways handling the removing: 1) Replace the asserts with if statements. 2) Replace the asserts with eu_static_assert. Asserts are heavily used across all elfutils libraries, and it's impossibe to implement the removing in one commit. So let's gradually remove the asserts in the later coming commits. https://sourceware.org/bugzilla/show_bug.cgi?id=31027 Signed-off-by: Di Chen --- libdwfl/dwfl_frame.c | 14 +++++++++----- libdwfl/dwfl_frame_pc.c | 3 ++- libdwfl/dwfl_frame_regs.c | 7 +++++-- libdwfl/dwfl_module_build_id.c | 3 ++- libdwfl/dwfl_module_getdwarf.c | 3 ++- libdwfl/dwfl_module_getsrc_file.c | 3 ++- libdwfl/dwfl_module_register_names.c | 3 ++- libdwfl/dwfl_segment_report_module.c | 2 +- 8 files changed, 25 insertions(+), 13 deletions(-) diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c index 5ee71dd4..18150e2a 100644 --- a/libdwfl/dwfl_frame.c +++ b/libdwfl/dwfl_frame.c @@ -85,12 +85,14 @@ free_states (Dwfl_Frame *state) static Dwfl_Frame * state_alloc (Dwfl_Thread *thread) { - assert (thread->unwound == NULL); + if (thread->unwound != NULL) + return NULL; Ebl *ebl = thread->process->ebl; size_t nregs = ebl_frame_nregs (ebl); if (nregs == 0) return NULL; - assert (nregs < sizeof (((Dwfl_Frame *) NULL)->regs_set) * 8); + if (nregs >= sizeof (((Dwfl_Frame *) NULL)->regs_set) * 8) + return NULL; Dwfl_Frame *state = malloc (sizeof (*state) + sizeof (*state->regs) * nregs); if (state == NULL) return NULL; @@ -283,8 +285,9 @@ dwfl_getthreads (Dwfl *dwfl, int (*callback) (Dwfl_Thread *thread, void *arg), } int err = callback (&thread, arg); if (err != DWARF_CB_OK) - return err; - assert (thread.unwound == NULL); + return err; + if (thread.unwound != NULL) + return -1; } /* NOTREACHED */ } @@ -450,7 +453,8 @@ dwfl_thread_getframes (Dwfl_Thread *thread, __libdwfl_seterrno (err); return -1; } - assert (state->pc_state == DWFL_FRAME_STATE_PC_UNDEFINED); + if (state->pc_state != DWFL_FRAME_STATE_PC_UNDEFINED) + return -1; free_states (state); return 0; } diff --git a/libdwfl/dwfl_frame_pc.c b/libdwfl/dwfl_frame_pc.c index 296c815b..b9991e9a 100644 --- a/libdwfl/dwfl_frame_pc.c +++ b/libdwfl/dwfl_frame_pc.c @@ -35,7 +35,8 @@ bool dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation) { - assert (state->pc_state == DWFL_FRAME_STATE_PC_SET); + if (state->pc_state != DWFL_FRAME_STATE_PC_SET) + return false; *pc = state->pc; ebl_normalize_pc (state->thread->process->ebl, pc); if (isactivation) diff --git a/libdwfl/dwfl_frame_regs.c b/libdwfl/dwfl_frame_regs.c index a4bd3884..064f5e8a 100644 --- a/libdwfl/dwfl_frame_regs.c +++ b/libdwfl/dwfl_frame_regs.c @@ -37,8 +37,11 @@ dwfl_thread_state_registers (Dwfl_Thread *thread, int firstreg, unsigned nregs, const Dwarf_Word *regs) { Dwfl_Frame *state = thread->unwound; - assert (state && state->unwound == NULL); - assert (state->initial_frame); + if (state == NULL || state->unwound != NULL || !state->initial_frame) + { + __libdwfl_seterrno (DWFL_E_INVALID_REGISTER); + return false; + } for (unsigned regno = firstreg; regno < firstreg + nregs; regno++) if (! __libdwfl_frame_reg_set (state, regno, regs[regno - firstreg])) { diff --git a/libdwfl/dwfl_module_build_id.c b/libdwfl/dwfl_module_build_id.c index 0c198f23..4dcc046e 100644 --- a/libdwfl/dwfl_module_build_id.c +++ b/libdwfl/dwfl_module_build_id.c @@ -65,7 +65,8 @@ __libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf) int build_id_len; /* For mod == NULL use dwelf_elf_gnu_build_id directly. */ - assert (mod != NULL); + if (mod == NULL) + return -1; int result = __libdwfl_find_elf_build_id (mod, elf, &build_id_bits, &build_id_elfaddr, &build_id_len); diff --git a/libdwfl/dwfl_module_getdwarf.c b/libdwfl/dwfl_module_getdwarf.c index 6f98c02b..596de51e 100644 --- a/libdwfl/dwfl_module_getdwarf.c +++ b/libdwfl/dwfl_module_getdwarf.c @@ -161,7 +161,8 @@ open_elf (Dwfl_Module *mod, struct dwfl_file *file) mod->e_type = ET_DYN; } else - assert (mod->main.elf != NULL); + if (mod->main.elf == NULL) + return DWFL_E (LIBELF, elf_errno ()); return DWFL_E_NOERROR; } diff --git a/libdwfl/dwfl_module_getsrc_file.c b/libdwfl/dwfl_module_getsrc_file.c index fc144225..4456dc58 100644 --- a/libdwfl/dwfl_module_getsrc_file.c +++ b/libdwfl/dwfl_module_getsrc_file.c @@ -165,7 +165,8 @@ dwfl_module_getsrc_file (Dwfl_Module *mod, if (cur_match > 0) { - assert (*nsrcs == 0 || *srcsp == match); + if (*nsrcs != 0 && *srcsp != match) + return -1; *nsrcs = cur_match; *srcsp = match; diff --git a/libdwfl/dwfl_module_register_names.c b/libdwfl/dwfl_module_register_names.c index 9ea09371..6fb4195b 100644 --- a/libdwfl/dwfl_module_register_names.c +++ b/libdwfl/dwfl_module_register_names.c @@ -73,7 +73,8 @@ dwfl_module_register_names (Dwfl_Module *mod, } if (likely (len > 0)) { - assert (len > 1); /* Backend should never yield "". */ + if (len <= 1) /* Backend should never yield "". */ + return -1; result = (*func) (arg, regno, setname, prefix, name, bits, type); } } diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c index dc34e0ae..39e27e22 100644 --- a/libdwfl/dwfl_segment_report_module.c +++ b/libdwfl/dwfl_segment_report_module.c @@ -530,7 +530,7 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, if (filesz > SIZE_MAX / sizeof (Elf32_Nhdr)) continue; - assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr)); + eu_static_assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr)); void *notes; if (ei_data == MY_ELFDATA -- 2.41.0