From: "Laszlo Ersek" <lersek@redhat.com>
To: edk2-devel-groups-io <devel@edk2.groups.io>
Cc: Anthony Perard <anthony.perard@citrix.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Jordan Justen <jordan.l.justen@intel.com>,
Julien Grall <julien.grall@arm.com>
Subject: [PATCH 08/10] OvmfPkg: suppress "Value stored to ... is never read" analyzer warnings
Date: Sat, 13 Apr 2019 01:31:26 +0200 [thread overview]
Message-ID: <20190412233128.4756-9-lersek@redhat.com> (raw)
In-Reply-To: <20190412233128.4756-1-lersek@redhat.com>
RH covscan warns about assignments that it can determine are never
"consumed" later ("dead stores"). The idea behind the warning is
presumably that the programmer forgot to implement a dependent check
somewhere.
For each such warning that has been emitted for OvmfPkg,
the case is one of the following however:
- We assign a variable a value for (re-)initialization's sake, in
preparation for further or future uses. This practice is safe (sometimes
even recommended!), hence we should suppress these warnings.
- We capture a result or a computation in a variable, following a general
programming pattern, but then decide to ignore the value in that
particular case. This is again safe, and we should suppress these
warnings too.
According to the Clang documentation at
https://clang-analyzer.llvm.org/faq.html#dead_store
we should use
(void)x;
See the logs below (produced originally for edk2-stable201903).
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/AcpiPlatformDxe/Xen.c:156:3: warning: Value
> stored to 'NumberOfTableEntries' is never read
> # NumberOfTableEntries = 0;
> # ^ ~
> edk2-89910a39dcfd/OvmfPkg/AcpiPlatformDxe/Xen.c:156:3: note: Value
> stored to 'NumberOfTableEntries' is never read
> # NumberOfTableEntries = 0;
> # ^ ~
> # 154| DsdtTable = NULL;
> # 155| TableHandle = 0;
> # 156|-> NumberOfTableEntries = 0;
> # 157|
> # 158| //
>
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c:43:3:
> warning: Value stored to 'SetupSize' is never read
> # SetupSize = 0;
> # ^ ~
> edk2-89910a39dcfd/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c:43:3:
> note: Value stored to 'SetupSize' is never read
> # SetupSize = 0;
> # ^ ~
> # 41|
> # 42| SetupBuf = NULL;
> # 43|-> SetupSize = 0;
> # 44| KernelBuf = NULL;
> # 45| KernelInitialSize = 0;
>
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c:609:9:
> warning: Value stored to 'VariableDataBufferSize' is never read
> # VariableDataBufferSize = 0;
> # ^ ~
> edk2-89910a39dcfd/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c:609:9:
> note: Value stored to 'VariableDataBufferSize' is never read
> # VariableDataBufferSize = 0;
> # ^ ~
> # 607| FreePool (VariableData);
> # 608| VariableData = NULL;
> # 609|-> VariableDataBufferSize = 0;
> # 610| }
> # 611| VariableData = AllocatePool (VariableDataSize);
>
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/Library/VirtioLib/VirtioLib.c:125:3: warning:
> Value stored to 'RingPagesPtr' is never read
> # RingPagesPtr += sizeof *Ring->Used.AvailEvent;
> # ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> edk2-89910a39dcfd/OvmfPkg/Library/VirtioLib/VirtioLib.c:125:3: note:
> Value stored to 'RingPagesPtr' is never read
> # RingPagesPtr += sizeof *Ring->Used.AvailEvent;
> # ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> # 123|
> # 124| Ring->Used.AvailEvent = (volatile VOID *) RingPagesPtr;
> # 125|-> RingPagesPtr += sizeof *Ring->Used.AvailEvent;
> # 126|
> # 127| Ring->QueueSize = QueueSize;
>
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c:1079:3:
> warning: Value stored to 'FwhInstance' is never read
> # FwhInstance = (EFI_FW_VOL_INSTANCE *)
> # ^ ~~~~~~~~~~~~~~~~~~~~~~~
> edk2-89910a39dcfd/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c:1079:3:
> note: Value stored to 'FwhInstance' is never read
> # FwhInstance = (EFI_FW_VOL_INSTANCE *)
> # ^ ~~~~~~~~~~~~~~~~~~~~~~~
> # 1077| ASSERT_RETURN_ERROR (PcdStatus);
> # 1078|
> # 1079|-> FwhInstance = (EFI_FW_VOL_INSTANCE *)
> # 1080| (
> # 1081| (UINTN) ((UINT8 *) FwhInstance) + FwVolHeader->HeaderLength +
>
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c:173:3:
> warning: Value stored to 'Status' is never read
> # Status = gDS->RemoveMemorySpace (
> # ^ ~~~~~~~~~~~~~~~~~~~~~~~~
> edk2-89910a39dcfd/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c:173:3:
> note: Value stored to 'Status' is never read
> # Status = gDS->RemoveMemorySpace (
> # ^ ~~~~~~~~~~~~~~~~~~~~~~~~
> # 171| // Mark flash region as runtime memory
> # 172| //
> # 173|-> Status = gDS->RemoveMemorySpace (
> # 174| BaseAddress,
> # 175| Length
>
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/SataControllerDxe/SataController.c:231:3:
> warning: Value stored to 'DeviceUDmaMode' is never read
> # DeviceUDmaMode = 0;
> # ^ ~
> edk2-89910a39dcfd/OvmfPkg/SataControllerDxe/SataController.c:231:3:
> note: Value stored to 'DeviceUDmaMode' is never read
> # DeviceUDmaMode = 0;
> # ^ ~
> # 229| UINT16 DeviceUDmaMode;
> # 230|
> # 231|-> DeviceUDmaMode = 0;
> # 232|
> # 233| //
>
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/VirtioGpuDxe/Gop.c:65:5: warning: Value stored
> to 'Status' is never read
> # Status = VirtioGpuSetScanout (
> # ^ ~~~~~~~~~~~~~~~~~~~~~
> edk2-89910a39dcfd/OvmfPkg/VirtioGpuDxe/Gop.c:65:5: note: Value stored to
> 'Status' is never read
> # Status = VirtioGpuSetScanout (
> # ^ ~~~~~~~~~~~~~~~~~~~~~
> # 63| // by setting ResourceId=0 for it.
> # 64| //
> # 65|-> Status = VirtioGpuSetScanout (
> # 66| VgpuGop->ParentBus, // VgpuDev
> # 67| 0, 0, 0, 0, // X, Y, Width, Height
>
> Error: CLANG_WARNING:
> edk2-89910a39dcfd/OvmfPkg/VirtioNetDxe/SnpReceive.c:165:3: warning:
> Value stored to 'RxPtr' is never read
> # RxPtr += sizeof (UINT16);
> # ^ ~~~~~~~~~~~~~~~
> edk2-89910a39dcfd/OvmfPkg/VirtioNetDxe/SnpReceive.c:165:3: note: Value
> stored to 'RxPtr' is never read
> # RxPtr += sizeof (UINT16);
> # ^ ~~~~~~~~~~~~~~~
> # 163| *Protocol = (UINT16) ((RxPtr[0] << 8) | RxPtr[1]);
> # 164| }
> # 165|-> RxPtr += sizeof (UINT16);
> # 166|
> # 167| Status = EFI_SUCCESS;
Cc: Anthony Perard <anthony.perard@citrix.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Julien Grall <julien.grall@arm.com>
Bugzilla: https://bugzilla.tianocore.org/show_bug.cgi?id=1710
Issue: scan-0992.txt
Issue: scan-0996.txt
Issue: scan-0997.txt
Issue: scan-0998.txt
Issue: scan-1000.txt
Issue: scan-1001.txt
Issue: scan-1006.txt
Issue: scan-1011.txt
Issue: scan-1012.txt
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
OvmfPkg/AcpiPlatformDxe/Xen.c | 5 +++++
OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c | 5 +++++
OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c | 4 ++++
OvmfPkg/Library/VirtioLib/VirtioLib.c | 5 +++++
OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c | 5 +++++
OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c | 5 +++++
OvmfPkg/SataControllerDxe/SataController.c | 5 +++++
OvmfPkg/VirtioGpuDxe/Gop.c | 6 ++++++
OvmfPkg/VirtioNetDxe/SnpReceive.c | 5 +++++
9 files changed, 45 insertions(+)
diff --git a/OvmfPkg/AcpiPlatformDxe/Xen.c b/OvmfPkg/AcpiPlatformDxe/Xen.c
index 357c60d23f4e..c8f275a8ee84 100644
--- a/OvmfPkg/AcpiPlatformDxe/Xen.c
+++ b/OvmfPkg/AcpiPlatformDxe/Xen.c
@@ -144,16 +144,21 @@ InstallXenTables (
Fadt2Table = NULL;
Fadt1Table = NULL;
Facs2Table = NULL;
Facs1Table = NULL;
DsdtTable = NULL;
TableHandle = 0;
NumberOfTableEntries = 0;
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)NumberOfTableEntries;
+
//
// Try to find Xen ACPI tables
//
Status = GetXenAcpiRsdp (&XenAcpiRsdpStructurePtr);
if (EFI_ERROR (Status)) {
return Status;
}
diff --git a/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c b/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
index ddfef925edd3..fde8c40218a4 100644
--- a/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
+++ b/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
@@ -37,16 +37,21 @@ TryRunningQemuKernel (
SetupSize = 0;
KernelBuf = NULL;
KernelInitialSize = 0;
CommandLine = NULL;
CommandLineSize = 0;
InitrdData = NULL;
InitrdSize = 0;
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)SetupSize;
+
if (!QemuFwCfgIsAvailable ()) {
return EFI_NOT_FOUND;
}
QemuFwCfgSelectItem (QemuFwCfgItemKernelSize);
KernelSize = (UINTN) QemuFwCfgRead64 ();
QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize);
diff --git a/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c b/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c
index a6cebcb54f6b..64fe9d9be543 100644
--- a/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c
+++ b/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c
@@ -596,16 +596,20 @@ SerializeVariablesIterateSystemVariables (
//
// The currently allocated VariableData buffer is too small,
// so we allocate a larger buffer.
//
if (VariableDataBufferSize != 0) {
FreePool (VariableData);
VariableData = NULL;
VariableDataBufferSize = 0;
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)VariableDataBufferSize;
}
VariableData = AllocatePool (VariableDataSize);
if (VariableData == NULL) {
Status = EFI_OUT_OF_RESOURCES;
break;
}
VariableDataBufferSize = VariableDataSize;
diff --git a/OvmfPkg/Library/VirtioLib/VirtioLib.c b/OvmfPkg/Library/VirtioLib/VirtioLib.c
index 555d2a5ce7c9..0e4b8b6b265e 100644
--- a/OvmfPkg/Library/VirtioLib/VirtioLib.c
+++ b/OvmfPkg/Library/VirtioLib/VirtioLib.c
@@ -113,16 +113,21 @@ VirtioRingInit (
RingPagesPtr += sizeof *Ring->Used.Idx;
Ring->Used.UsedElem = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.UsedElem * QueueSize;
Ring->Used.AvailEvent = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.AvailEvent;
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)RingPagesPtr;
+
Ring->QueueSize = QueueSize;
return EFI_SUCCESS;
}
/**
Tear down the internal resources of a configured virtio ring.
diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c
index edf438a422fa..ff6565865846 100644
--- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c
+++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c
@@ -1071,16 +1071,21 @@ FvbInitialize (
ASSERT_RETURN_ERROR (PcdStatus);
FwhInstance = (EFI_FW_VOL_INSTANCE *)
(
(UINTN) ((UINT8 *) FwhInstance) + FwVolHeader->HeaderLength +
(sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))
);
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)FwhInstance;
+
//
// Module type specific hook.
//
InstallVirtualAddressChangeHandler ();
PcdStatus = PcdSetBoolS (PcdOvmfFlashVariablesEnable, TRUE);
ASSERT_RETURN_ERROR (PcdStatus);
return EFI_SUCCESS;
diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c
index 69b20916bc7c..979122f2e2fd 100644
--- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c
+++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c
@@ -164,16 +164,21 @@ MarkIoMemoryRangeForRuntimeAccess (
//
// Mark flash region as runtime memory
//
Status = gDS->RemoveMemorySpace (
BaseAddress,
Length
);
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)Status;
+
Status = gDS->AddMemorySpace (
EfiGcdMemoryTypeMemoryMappedIo,
BaseAddress,
Length,
EFI_MEMORY_UC | EFI_MEMORY_RUNTIME
);
ASSERT_EFI_ERROR (Status);
diff --git a/OvmfPkg/SataControllerDxe/SataController.c b/OvmfPkg/SataControllerDxe/SataController.c
index 8d6a6bbb2286..0cf6b42c886a 100644
--- a/OvmfPkg/SataControllerDxe/SataController.c
+++ b/OvmfPkg/SataControllerDxe/SataController.c
@@ -219,16 +219,21 @@ CalculateBestUdmaMode (
OUT UINT16 *SelectedMode
)
{
UINT16 TempMode;
UINT16 DeviceUDmaMode;
DeviceUDmaMode = 0;
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)DeviceUDmaMode;
+
//
// Check whether the WORD 88 (supported UltraDMA by drive) is valid
//
if ((IdentifyData->AtaData.field_validity & 0x04) == 0x00) {
return EFI_UNSUPPORTED;
}
DeviceUDmaMode = IdentifyData->AtaData.ultra_dma_mode;
diff --git a/OvmfPkg/VirtioGpuDxe/Gop.c b/OvmfPkg/VirtioGpuDxe/Gop.c
index 0b2659d1d2b9..d0f81c349f73 100644
--- a/OvmfPkg/VirtioGpuDxe/Gop.c
+++ b/OvmfPkg/VirtioGpuDxe/Gop.c
@@ -57,16 +57,22 @@ ReleaseGopResources (
// by setting ResourceId=0 for it.
//
Status = VirtioGpuSetScanout (
VgpuGop->ParentBus, // VgpuDev
0, 0, 0, 0, // X, Y, Width, Height
0, // ScanoutId
0 // ResourceId
);
+
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)Status;
+
//
// HACK BEGINS HERE
//
// According to the GPU Device section of the VirtIo specification, the
// above operation is valid:
//
// "The driver can use resource_id = 0 to disable a scanout."
//
diff --git a/OvmfPkg/VirtioNetDxe/SnpReceive.c b/OvmfPkg/VirtioNetDxe/SnpReceive.c
index cdee9a2aee47..51b2f8a4e370 100644
--- a/OvmfPkg/VirtioNetDxe/SnpReceive.c
+++ b/OvmfPkg/VirtioNetDxe/SnpReceive.c
@@ -153,16 +153,21 @@ VirtioNetReceive (
}
RxPtr += SIZE_OF_VNET (Mac);
if (Protocol != NULL) {
*Protocol = (UINT16) ((RxPtr[0] << 8) | RxPtr[1]);
}
RxPtr += sizeof (UINT16);
+ //
+ // Suppress "Value stored to ... is never read" analyzer warnings.
+ //
+ (VOID)RxPtr;
+
Status = EFI_SUCCESS;
RecycleDesc:
++Dev->RxLastUsed;
//
// virtio-0.9.5, 2.4.1 Supplying Buffers to The Device
//
--
2.19.1.3.g30247aa5d201
next prev parent reply other threads:[~2019-04-12 23:31 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-12 23:31 [PATCH 00/10] patches for some warnings raised by "RH covscan" Laszlo Ersek
2019-04-12 23:31 ` [PATCH 01/10] MdePkg/PiFirmwareFile: express IS_SECTION2 in terms of SECTION_SIZE Laszlo Ersek
2019-04-15 17:01 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-04-12 23:31 ` [PATCH 02/10] MdePkg/PiFirmwareFile: fix undefined behavior in SECTION_SIZE Laszlo Ersek
2019-04-14 7:19 ` [edk2-devel] " Jordan Justen
2019-04-15 16:15 ` Laszlo Ersek
2019-04-16 8:28 ` Liming Gao
2019-04-16 9:04 ` Jordan Justen
2019-04-16 10:59 ` Laszlo Ersek
2019-04-16 16:50 ` Philippe Mathieu-Daudé
2019-04-17 10:08 ` Laszlo Ersek
2019-04-16 18:48 ` Jordan Justen
2019-04-16 23:25 ` Andrew Fish
2019-04-17 10:29 ` Laszlo Ersek
2019-04-17 11:44 ` Andrew Fish
2019-04-17 14:59 ` Laszlo Ersek
2019-04-17 19:35 ` Jordan Justen
2019-04-18 9:38 ` Laszlo Ersek
2019-04-18 15:18 ` Liming Gao
2019-04-17 10:01 ` Laszlo Ersek
2019-04-12 23:31 ` [PATCH 03/10] BaseTools/PiFirmwareFile: " Laszlo Ersek
2019-04-12 23:31 ` [PATCH 04/10] MdePkg/PiFirmwareFile: fix undefined behavior in FFS_FILE_SIZE Laszlo Ersek
2019-04-15 17:23 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-04-17 17:52 ` Michael D Kinney
2019-04-17 18:31 ` Michael D Kinney
2019-04-18 9:06 ` Laszlo Ersek
2019-04-17 18:31 ` Andrew Fish
2019-04-17 18:36 ` Michael D Kinney
2019-04-18 8:48 ` Laszlo Ersek
2019-04-18 8:45 ` Laszlo Ersek
2019-04-18 23:12 ` Laszlo Ersek
2019-04-18 17:20 ` Philippe Mathieu-Daudé
2019-04-18 17:59 ` Michael D Kinney
2019-04-18 18:12 ` Philippe Mathieu-Daudé
2019-04-12 23:31 ` [PATCH 05/10] OvmfPkg/Sec: fix out-of-bounds reads Laszlo Ersek
2019-04-15 17:24 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-04-12 23:31 ` [PATCH 06/10] OvmfPkg/QemuVideoDxe: avoid arithmetic on null pointer Laszlo Ersek
2019-04-12 23:31 ` [PATCH 07/10] OvmfPkg/AcpiPlatformDxe: suppress invalid "deref of undef pointer" warning Laszlo Ersek
2019-04-15 17:26 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-04-12 23:31 ` Laszlo Ersek [this message]
2019-04-14 8:03 ` [edk2-devel] [PATCH 08/10] OvmfPkg: suppress "Value stored to ... is never read" analyzer warnings Jordan Justen
2019-04-15 16:25 ` Laszlo Ersek
2019-04-16 9:26 ` Jordan Justen
2019-04-16 11:44 ` Laszlo Ersek
2019-04-12 23:31 ` [PATCH 09/10] OvmfPkg/AcpiPlatformDxe: catch theoretical nullptr deref in Xen code Laszlo Ersek
2019-04-15 17:28 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-04-12 23:31 ` [PATCH 10/10] OvmfPkg/BasePciCapLib: suppress invalid "nullptr deref" warning Laszlo Ersek
2019-04-15 17:31 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-04-16 11:01 ` Laszlo Ersek
2019-04-12 23:36 ` [PATCH 00/10] patches for some warnings raised by "RH covscan" Ard Biesheuvel
2019-04-15 16:16 ` Laszlo Ersek
2019-04-18 14:20 ` [edk2-devel] " Laszlo Ersek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190412233128.4756-9-lersek@redhat.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox