[libc-commits] [PATCH] D107999: [libc] Add strtol, strtoul, and strtoull

Siva Chandra via Phabricator via libc-commits libc-commits at lists.llvm.org
Mon Aug 16 22:04:54 PDT 2021


sivachandra accepted this revision.
sivachandra added inline comments.
This revision is now accepted and ready to land.


================
Comment at: libc/src/__support/str_conv_utils.h:120
+  return (result_sign == '+') ? static_cast<T>(result)
+                              : -static_cast<T>(result);
 }
----------------
michaelrj wrote:
> sivachandra wrote:
> > When the sign is negative and result is `ABS_MAX` and the return type is a signed integer type, then I think we have to handle that specially. Consider this: T is `long`, `result_sign` is `-` and `result` is `ABS_MAX` which is effectively `LONG_MAX + 1`. Since `LONG_MAX + 1` cannot be represent as a `long` type, the `static_cast` here becomes an implementation defined operation.
> > 
> > I think previously also it was implementation defined.
> > 
> You're right, I've added an extra case and a comment explaining it.
Can we may be handle the overflow case like this:

```
if (result == ABS_MAX) {
  if (result_sign == '+' || is_unsigned) 
     return __llvm_libc::cpp::NumericLimits<T>::max();
  else // T is signed and there is a negative overflow
     return __llvm_libc::cpp::NumericLimits<T>::min();
}
```

For better readability, before line 78 you can define the following and use it above and also on line 79.

```
constexpr bool is_unsigned = (__llvm_libc::cpp::NumericLimits<T>::min() == 0);
```

Along the same lines, you can probably also define:

```
const bool is_positive = (result_sign == '+');
```


================
Comment at: libc/src/__support/str_conv_utils.h:78
 
+  unsigned long long const NEGATIVE_MAX =
+      (__llvm_libc::cpp::NumericLimits<T>::min() != 0)
----------------
This can be `constexpr`.


================
Comment at: libc/src/__support/str_conv_utils.h:94
+    ++src;
+
+    if (result == ABS_MAX)
----------------
Add a comment here explaining the early return; point out that we read out the full number even if it is out of range.


================
Comment at: libc/src/stdlib/CMakeLists.txt:93
+)
\ No newline at end of file

----------------
Fix here and in many other files.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D107999/new/

https://reviews.llvm.org/D107999



More information about the libc-commits mailing list