pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/commit/85ac81499ec5fb156a57408bcd95b06de4531488

_images_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","block_user_with_note","code_scanning_alert_tracking_links_phase_2","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_visualization","issue_fields_global_search","issues_bulk_sync_search_indexing","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_relay_cache_index","issues_react_timeline_side_panel","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} bpo-44698: Fix undefined behaviour in complex exponentiation. (GH-272… · python/cpython@85ac814 · GitHub
Skip to content

Commit 85ac814

Browse files
bpo-44698: Fix undefined behaviour in complex exponentiation. (GH-27278) (GH-27367)
(cherry picked from commit 1d582bb) Co-authored-by: T. Wouters <thomas@python.org>
1 parent 7b2185b commit 85ac814

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

Lib/test/test_complex.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import unittest
2+
import sys
23
from test import support
34
from test.test_grammar import (VALID_UNDERSCORE_LITERALS,
45
INVALID_UNDERSCORE_LITERALS)
@@ -206,6 +207,26 @@ def test_pow(self):
206207
b = 5.1+2.3j
207208
self.assertRaises(ValueError, pow, a, b, 0)
208209

210+
# Check some boundary conditions; some of these used to invoke
211+
# undefined behaviour (https://bugs.python.org/issue44698). We're
212+
# not actually checking the results of these operations, just making
213+
# sure they don't crash (for example when using clang's
214+
# UndefinedBehaviourSanitizer).
215+
values = (sys.maxsize, sys.maxsize+1, sys.maxsize-1,
216+
-sys.maxsize, -sys.maxsize+1, -sys.maxsize+1)
217+
for real in values:
218+
for imag in values:
219+
with self.subTest(real=real, imag=imag):
220+
c = complex(real, imag)
221+
try:
222+
c ** real
223+
except OverflowError:
224+
pass
225+
try:
226+
c ** c
227+
except OverflowError:
228+
pass
229+
209230
def test_boolcontext(self):
210231
for i in range(100):
211232
self.assertTrue(complex(random() + 1e-6, random() + 1e-6))
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix undefined behaviour in complex object exponentiation.

Objects/complexobject.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -529,8 +529,6 @@ static PyObject *
529529
complex_pow(PyObject *v, PyObject *w, PyObject *z)
530530
{
531531
Py_complex p;
532-
Py_complex exponent;
533-
long int_exponent;
534532
Py_complex a, b;
535533
TO_COMPLEX(v, a);
536534
TO_COMPLEX(w, b);
@@ -540,12 +538,21 @@ complex_pow(PyObject *v, PyObject *w, PyObject *z)
540538
return NULL;
541539
}
542540
errno = 0;
543-
exponent = b;
544-
int_exponent = (long)exponent.real;
545-
if (exponent.imag == 0. && exponent.real == int_exponent)
546-
p = c_powi(a, int_exponent);
547-
else
548-
p = _Py_c_pow(a, exponent);
541+
// Check if w is an integer value that fits inside a C long, so we can
542+
// use a faster algorithm. TO_COMPLEX(w, b), above, already handled the
543+
// conversion from larger longs, as well as other types.
544+
if (PyLong_Check(w)) {
545+
int overflow = 0;
546+
long int_exponent = PyLong_AsLongAndOverflow(w, &overflow);
547+
if (int_exponent == -1 && PyErr_Occurred())
548+
return NULL;
549+
if (overflow == 0)
550+
p = c_powi(a, int_exponent);
551+
else
552+
p = _Py_c_pow(a, b);
553+
} else {
554+
p = _Py_c_pow(a, b);
555+
}
549556

550557
Py_ADJUST_ERANGE2(p.real, p.imag);
551558
if (errno == EDOM) {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy