Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
rust/Cargo.lock
_codeql_build_dir/
_codeql_detected_source_root
7 changes: 5 additions & 2 deletions cores/arduino/zephyrCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,22 +115,25 @@ constexpr inline pin_size_t global_gpio_pin(const struct device *lport, pin_size

constexpr inline const struct device *local_gpio_port(pin_size_t gpin) {
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
return arduino_pins[gpin].port;
return (gpin < ARRAY_SIZE(arduino_pins)) ? arduino_pins[gpin].port : nullptr;
Comment on lines 116 to +118

Copilot AI Feb 10, 2026

Copy link

Choose a reason for hiding this comment

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

local_gpio_port() now returns nullptr and local_gpio_pin() can return pin_size_t(-1) for out-of-range pins, but at least one call site (e.g. attachInterrupt()) assumes a valid port/pin: it asserts pcb != nullptr even when port is nullptr, and then does BIT(local_gpio_pin(pinNumber)) which becomes a shift by -1. Please add consistent guards in callers (or in a shared helper) to early-return when local_gpio_port() is null and/or local_gpio_pin() is -1 before any indexing/bit-shifts/dereferences.

Copilot uses AI. Check for mistakes.
#else
return local_gpio_port_r(gpin, gpio_ports, 0, gpio_ngpios, ARRAY_SIZE(gpio_ports));
#endif
}

constexpr inline pin_size_t local_gpio_pin(pin_size_t gpin) {
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
return arduino_pins[gpin].pin;
return (gpin < ARRAY_SIZE(arduino_pins)) ? arduino_pins[gpin].pin : pin_size_t(-1);
#else
return port_idx(gpin) == pin_size_t(-1) ? pin_size_t(-1) : gpin - end_accum(port_idx(gpin));
#endif
}

inline int global_gpio_pin_configure(pin_size_t pinNumber, int flags) {
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
if (pinNumber >= ARRAY_SIZE(arduino_pins)) {
return -1;
}
Comment on lines 132 to +136

Copilot AI Feb 10, 2026

Copy link

Choose a reason for hiding this comment

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

In the digital_pin_gpios path, global_gpio_pin_configure() returns -1 for an invalid pinNumber. Elsewhere in this file invalid arguments typically return -EINVAL/-ENOTSUP (e.g. analogRead()), and Zephyr GPIO APIs return negative errno codes. Consider returning -EINVAL here as well to keep error semantics consistent (even if most callers currently ignore the return value).

Copilot uses AI. Check for mistakes.
return gpio_pin_configure_dt(&arduino_pins[pinNumber], flags);
#else
const struct device *port = local_gpio_port(pinNumber);
Expand Down