Skip to content

Avoid memset for struct initialization#2051

Merged
tatsuhiro-t merged 1 commit intomainfrom
avoid-memset
Mar 3, 2026
Merged

Avoid memset for struct initialization#2051
tatsuhiro-t merged 1 commit intomainfrom
avoid-memset

Conversation

@tatsuhiro-t
Copy link
Copy Markdown
Member

No description provided.

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request refactors the initialization patterns for various data structures by adopting C99 compound literal initializers. This change streamlines the code by replacing explicit memset calls with a more concise and type-safe method for zero-initializing structs and arrays, enhancing overall code quality and maintainability.

Highlights

  • Modernized Initialization: Replaced numerous instances of memset(..., 0, sizeof(...)) with C99 compound literal initializers like (type){0} for structs and arrays across the codebase.
  • Improved Readability and Safety: The use of compound literals makes the intent of zero-initialization clearer and can prevent common memset errors related to incorrect size arguments.
  • Consistency: Standardized the approach to zero-initializing various data structures, including crypto contexts, connection IDs, client structures, and packet headers.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • crypto/gnutls/gnutls.c
    • Replaced memset with static const uint8_t iv[16] = {0}; for IV array initialization.
  • crypto/picotls/picotls.c
    • Updated ngtcp2_crypto_picotls_ctx_init to use compound literal initialization for the entire cptls struct.
  • crypto/shared.c
    • Initialized plaintext arrays directly at declaration with {0}, removing subsequent memset calls.
  • examples/gtlssimpleclient.c
    • Changed client struct initialization from memset to compound literal *c = (struct client){0};.
  • examples/simpleclient.c
    • Changed client struct initialization from memset to compound literal *c = (struct client){0};.
  • lib/ngtcp2_cid.c
    • Updated ngtcp2_cid_zero to use compound literal initialization for ngtcp2_cid.
  • lib/ngtcp2_conn.c
    • Replaced memset calls with compound literal initialization for ngtcp2_crypto_cipher_ctx structs in various key installation and discard functions.
  • tests/ngtcp2_conn_test.c
    • Replaced memset calls with compound literal initialization for my_user_data and ngtcp2_pkt_hd structs in test cases.
  • tests/ngtcp2_pkt_test.c
    • Replaced memset calls with compound literal initialization for ngtcp2_stream, ngtcp2_connection_close, ngtcp2_datagram, and ngtcp2_pkt_hd structs in packet encoding/decoding tests.
Activity
  • No specific activity (comments, reviews, progress) has been recorded for this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the codebase to use C99 designated initializers ({0}) for zero-initializing structs and arrays, replacing memset. This is a great improvement for code readability and can offer performance benefits. The changes are consistently applied and correct across most of the files.

I've pointed out one area of concern in crypto/gnutls/gnutls.c where a const qualifier is cast away. This could lead to undefined behavior, and I've suggested a safer alternative that still achieves the goal of removing memset.

Overall, this is a solid refactoring effort.

Note: Security Review did not run due to the size of the PR.

Comment on lines +407 to +410
static const uint8_t iv[16] = {0};
uint8_t buf[16];

gnutls_cipher_set_iv(hd, iv, sizeof(iv));
gnutls_cipher_set_iv(hd, (uint8_t *)iv, sizeof(iv));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Using static const is a good optimization, but casting away const for gnutls_cipher_set_iv is risky, as it could lead to undefined behavior if the function modifies the buffer. A safer approach which still avoids memset is to use a stack-allocated array with an initializer. This ensures that a fresh zeroed buffer is used for each call without the risks of modifying a const object.

    uint8_t iv[16] = {0};
    uint8_t buf[16];

    gnutls_cipher_set_iv(hd, iv, sizeof(iv));

@tatsuhiro-t tatsuhiro-t merged commit 9ac6f9b into main Mar 3, 2026
73 checks passed
@tatsuhiro-t tatsuhiro-t deleted the avoid-memset branch March 3, 2026 08:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant